Producción de Azúcar
Información del conjunto de datos: azúcar se ha disuelto en agua sin amortiguar y la solución se midió espectrofluorométricamente en una cubeta de 10 \(\times\) 10 \(mm^2\). Los datos en bruto se midieron con un fluorómetro. Para cada muestra, los espectros de emisión se midieron en intervalos de \(0.5\) nm en siete ondas de excitación.
Es decir, tenemos una muestra de tamaño 265, en 571 puntos para cada una de las 7 ondas de longitudes de excitación.
En nuestro caso, decidimos tomar el nivel de excitación correspondiente al nivel de onda 340. Para entender un poco mejor los datos, visualicemos la información sin haberla tratado (i.e. en bruto).

Después de visualizar las funciones (sin suavizar) consideramos como más acertado usar una base de funciones B-Spline para llevar a cabo el suavizado, pues en los datos no se perciben comportamientos cíclicos (o sinusoidales). Como apunte adicional, mencionamos que para llevar a cabo el ajuste nos bastó con usar polinomios de grado 3 (orden 4) y para la parte que presentaba un apuntamiento muy alto usamos más breakpoints.
A continuación podemos ver las versiones suavizadas de la muestra en cuestión.

Para contrastar las estimaciones, vamos a superponer los datos sin tratar, junto con las respectivas curvas suavizadas.

Función de varianza
Se calculó usando todos los datos.

Función de covarianza
Mostramos la superficie obtenida. Con la función persp obtenemos una figura no muy agradable. Sin embargo, usaremos la función plot_ly que graficará la superficie en una página web y tomamos capturas de pantalla.
Aprovechamos para visualizar las funciones de varianza y covarianza, y la matriz de correlaciones.
Otra forma de visualizarlo sería usando mapas de calor. A continucación

Funciones cuantiles 90% y 95%
Cuando tomamos el \(p\%\) de bandas más profundas y construimos la banda, fuera de la banda queda \((1-p)\%\) y por ende \(\left(\frac{1-p}{2}\right)\%\) en los extremos. Luego, la banda máxima cubre \(\left(p + \frac{1-p}{2}\right)\&\). Es decir, tenemos un cuantil que cubre:
\(q = \frac{1+p}{2} \implies p = 2q - 1\)
Es decir, que si especificamos el cuantil \(q\), podremos saber cual es la banda \(p\) a elegir.
Entonces tenemos:
- Al cuantil \(q_{90}\) le corresponde la región \(p = 0.8\)
- Al cuantil \(q_{95}\) le corresponde la región \(p = 0.9\)
En el mismo gráfico presentamos las funciones de los cuantiles solicitados.

Región central 0.75

Boxplot funcional y outliers
Los números que aparecen en la leyenda son los identificadores de las funciones \(\widehat{x}\) consideradas como atípicas. En este caso, podemos considerar que se tratan de outliers parciales. Las observaciones 131, 71 y 10, tienen una región (intervalo 350-450 aproximadamente) en la que las curvas o bien decrecen de forma muy suave o bien se comportan de forma creciente (contrario al boxplot que tenemos de fondo).

Boxplot funcional ajustado y outliers
- Debido a las dificultades que encontramos para implementar la estimación de la matriz de varianzas y covarianzas robusta usamos dos formas. Primero con el paquete roahd.
La tasa positiva de outliers que usamos fue de 99.7%.
Con lo que obtuvimos un valor para el hiperparámetro F de 1.077.

Vemos que ajustando el factor, obtenemos los 3 outliers de antes (outliers parciales). De igual forma, los datos 13, 15 y 268 también resultan ser outliers parciales, pues vemos que en ciertas regiones se comportan de forma distinta al resto de funciones. Finalmente se obtienen los outliers correspondientes a los datos 14, 16, 17 y 38. Estos últimos es más difícil de justificar con una simple visualización, pues en las partes en donde salen del boxplot son muy pocas y pequeñas.
solo obtenemos 3 datos atípicos. Justamente los 3 datos que habíamos catalogados como outliers parciales (y que en cierta medida, era más sencillo justificar porqué eran outliers).
- Como alternativa, proponemos basarnos en técnicas de remuestreo para estimar el boxplot sin usar los que parecen ser datos atípicos (es decir, sin considerar los 5 datos que considerabamos como outliers) y definir el valor del hiperparámetro F.
Los gráficos nos ayudan a ver el efecto de haber cambiado el factor \(F\) de 1.5 a 1.74 y vemos que la proporción de datos catalogados como atípicos cuando no lo son pasa de un 5% a un 2%.

Mostramos a continuación el boxplot resultante al modificar el factor F.

Aunque parece más acertada la salida de la función roahd::fbplot usando el parámetro adjust.
Outliers multivariados
Mostramos los identificadores de los individuos que aparecen como atípicos.

Como vemos, los individuos 10, 71 y 131 aparecen nuevamente como datos atípicos (aún considerando los datos multivariados). Sin embargo nos llamó la atención que el individuo 15 no fuese un outlier a nivel multivariado pero los individuos 14 y 16 si.
Artículo: Comparative study of different B-spline approaches for functional data
Referencia del artículo: Aguilera, A. M., & Aguilera-Morillo, M. C. (2013). Comparative study of different B-spline approaches for functional data. Mathematical and Computer Modelling, 58(7-8), 1568-1579.
Siguiendo la contrucción del artículo de Aguilera, se generan los datos simulados, generando 100 curvas de un proceso estocástico de media cero que sigue que cada curva X, posee un comportamiento dado por \(X (t)=R cos (2\pi t+ \theta)\), en el cual \(R\) y \(\theta\) provienen de una distribución i.i.d Rayleigh(\(\sigma\)), con \(\sigma=0.3\) y Uniforme \([0,2\pi]\), respectivamente.
Se realiza una muestra de observaciones con 51 nodos (knots) igualmente espaciados en el intervalo \(T=[0,1]\), en el cual los errores de cada curva se comportan de manera \(Normal(0,\sigma²)\) con \(\sigma²=0.07\)
Regression Splines La primera curva a partir de un \(R\) y \(\theta\) aleatorio se construye, siguiendo las dos bases de nuestro interés. Tanto Fourier como B-Splines
se crea la base para la construcción de regresiones splines y smoothing splines, generadas a partir de bases B-Splines y Bases de Fourier, respectivamente, con 51 nodos en el intervalo \(T=[0,1]\)

Smoothing Splines

Para las gráficas que genera el autor, se generan las 100 curvas a partir de la simulación, tal como se menciona en un inicio, y se grafican las funciones
Se grafica la función rela, la función simulada con errores normales, y con las bases que definimos en el planteamiento de la simulación (5, 15 y 25). Ajustando también Regresión Spline y Smoothing Spline con un \(\lambda=0.01\)



Se grafica el boxplot correspondiente a los valores GCV con cada uno de los valores de número de base

Se grafica la función media para las 100 cruvas generadas para cada una de las elecciones de número de bases (5,15 y 25). También se presenta un boxplot de MSE para ambos métodos de ajuste (Smoothing splines y Reggresion Splines)
graficar con 5 bases


graficar con 15 bases


Graficar con 25 bases


LS0tCnRpdGxlOiBUYWxsZXIgXCMgMgphdXRob3I6IAogICAgLSBKdWFuIFNlYmFzdGlhbiBHw7NtZXogRC4KICAgIC0gRGFuaWVsIEZlbGlwZSBDZW5kYWxlcyBHLgpvdXRwdXQ6IAogICAgaHRtbF9ub3RlYm9vazoKICAgICAgICB0b2M6IHRydWUKICAgICAgICB0b2NfZGVwdGg6IDIKICAgICAgICB0b2NfZmxvYXQ6IHRydWUKICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKLS0tCgpgYGB7ciBDb25maWd1cmFjaW9uZXMgZ2xvYmFsZXMsIGVjaG8gPSBGQUxTRX0KIyBDb25maWd1cmFjaW9uZXMgZ2VuZXJhbGVzCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmdzID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cyA9ICdoaWRlJykKYGBgCgpgYGB7cn0KY2FyZ2FfZV9pbnN0YWxhIDwtIGZ1bmN0aW9uKHgpewogICAgbm9faW5zdGFsYWRvcyA8LSAhKHggJWluJSBpbnN0YWxsZWQucGFja2FnZXMoKVssIDFdKQogICAgaWYoYW55KG5vX2luc3RhbGFkb3MpKXsKICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHhbbm9faW5zdGFsYWRvc10pCiAgICB9CiAgICBzYXBwbHkoeCwgbGlicmFyeSwgbG9naWNhbC5yZXR1cm4gPSBUUlVFLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCn0KCnBhcXVldGVzIDwtIGMoJ2ZkYScsICdmZGEudXNjJywgJ1ZHQU0nLCAnZ2dwbG90MicsICdwbG90bHknLCdwYXRjaHdvcmsnKQpjYXJnYV9lX2luc3RhbGEocGFxdWV0ZXMpCmBgYAoKIyBQcm9kdWNjacOzbiBkZSBBesO6Y2FyIHsudGFic2V0fQoKKipJbmZvcm1hY2nDs24gZGVsIGNvbmp1bnRvIGRlIGRhdG9zOioqIGF6w7pjYXIgc2UgaGEgZGlzdWVsdG8gZW4gYWd1YSBzaW4gYW1vcnRpZ3VhciB5IGxhIHNvbHVjacOzbiBzZSBtaWRpw7MgZXNwZWN0cm9mbHVvcm9tw6l0cmljYW1lbnRlIGVuIHVuYSBjdWJldGEgZGUgMTAgJFx0aW1lcyQgMTAgJG1tXjIkLiBMb3MgZGF0b3MgZW4gYnJ1dG8gc2UgbWlkaWVyb24gY29uIHVuIGZsdW9yw7NtZXRyby4gUGFyYSBjYWRhIG11ZXN0cmEsIGxvcyBlc3BlY3Ryb3MgZGUgZW1pc2nDs24gc2UgbWlkaWVyb24gZW4gaW50ZXJ2YWxvcyBkZSAkMC41JCBubSBlbiBzaWV0ZSBvbmRhcyBkZSBleGNpdGFjacOzbi4KCkVzIGRlY2lyLCB0ZW5lbW9zIHVuYSBtdWVzdHJhIGRlIHRhbWHDsW8gMjY1LCBlbiA1NzEgcHVudG9zIHBhcmEgY2FkYSB1bmEgZGUgbGFzIDcgb25kYXMgZGUgbG9uZ2l0dWRlcyBkZSBleGNpdGFjacOzbi4KCkVuIG51ZXN0cm8gY2FzbywgZGVjaWRpbW9zIHRvbWFyIGVsIG5pdmVsIGRlIGV4Y2l0YWNpw7NuIGNvcnJlc3BvbmRpZW50ZSBhbCBuaXZlbCBkZSBvbmRhIDM0MC4gUGFyYSBlbnRlbmRlciB1biBwb2NvIG1lam9yIGxvcyBkYXRvcywgdmlzdWFsaWNlbW9zIGxhIGluZm9ybWFjacOzbiBzaW4gaGFiZXJsYSB0cmF0YWRvIChpLmUuIGVuIGJydXRvKS4KCmBgYHtyIExlY3R1cmEgZGUgZGF0b3MgeSBDb25maWcuIGluaWNpYWx9CiMgTGVjdHVyYSBkZSBkYXRvcwpydXRhIDwtICcuL0RhdG9zL2RhdG9zLnR4dCcKZGF0b3MxIDwtIHJlYWQudGFibGUoY29sQ2xhc3NlcyA9IHJlcChjKCdOVUxMJywgJ251bWVyaWMnKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyg2LCAxKSo1NzEpLCBmaWxlID0gcnV0YSkKIyBHcsOhZmljb3MKdF9yYW5nbyA8LSBzZXEoMjc1LCA1NjAsIGJ5ID0gMC41KQptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gdChkYXRvczEpLCB0eXBlID0gJ3AnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4yLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgICBtYWluID0gJ0RhdG9zIG9ic2VydmFkb3MnLAogICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgeWxhYiA9ICdGbHVvcmVzZW5jaWEnKQpgYGAKCkRlc3B1w6lzIGRlIHZpc3VhbGl6YXIgbGFzIGZ1bmNpb25lcyAoc2luIHN1YXZpemFyKSBjb25zaWRlcmFtb3MgY29tbyBtw6FzIGFjZXJ0YWRvIHVzYXIgdW5hIGJhc2UgZGUgZnVuY2lvbmVzICpCLVNwbGluZSogcGFyYSBsbGV2YXIgYSBjYWJvIGVsIHN1YXZpemFkbywgcHVlcyBlbiBsb3MgZGF0b3Mgbm8gc2UgcGVyY2liZW4gY29tcG9ydGFtaWVudG9zIGPDrWNsaWNvcyAobyBzaW51c29pZGFsZXMpLiBDb21vIGFwdW50ZSBhZGljaW9uYWwsIG1lbmNpb25hbW9zIHF1ZSBwYXJhIGxsZXZhciBhIGNhYm8gZWwgYWp1c3RlIG5vcyBiYXN0w7MgY29uIHVzYXIgcG9saW5vbWlvcyBkZSBncmFkbyAzIChvcmRlbiA0KSB5IHBhcmEgbGEgcGFydGUgcXVlIHByZXNlbnRhYmEgdW4gYXB1bnRhbWllbnRvIG11eSBhbHRvIHVzYW1vcyBtw6FzICpicmVha3BvaW50cyouCgpgYGB7ciBDcmVhY2nDs24gZGUgYmFzZX0KIyBCYXNlIHF1ZSBzZSB2YSBhIHVzYXIKYmsgPC0gYygyNzUsIDI4NSwgMzAwLCAzMjAsIDM2MC41LCAzODksIDQzMCwgNDcwLCA1MjAsIDU2MCkKYmFzZV9ic3AgPC0gY3JlYXRlLmJzcGxpbmUuYmFzaXMoYnJlYWtzID0gYmssIG5vcmRlciA9IDQpCmBgYAoKQSBjb250aW51YWNpw7NuIHBvZGVtb3MgdmVyIGxhcyB2ZXJzaW9uZXMgc3Vhdml6YWRhcyBkZSBsYSBtdWVzdHJhIGVuIGN1ZXN0acOzbi4KCmBgYHtyfQphanVzdGUgPC0gRGF0YTJmZCh5ID0gYXMubWF0cml4KHQoZGF0b3MxKSksIAogICAgICAgICAgICAgICAgICBiYXNpc29iaiA9IGJhc2VfYnNwLCAKICAgICAgICAgICAgICAgICAgYXJndmFscyA9IHRfcmFuZ28pCnBsb3QoYWp1c3RlLCBmcmFtZSA9IEZBTFNFLCBtYWluID0gJ0N1cnZhcyBTdWF2aXphZGFzJywgCiAgICAgeWxhYiA9ICdGbHVvcmVzY2VuY2lhJywgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnKQpgYGAKClBhcmEgY29udHJhc3RhciBsYXMgZXN0aW1hY2lvbmVzLCB2YW1vcyBhIHN1cGVycG9uZXIgbG9zIGRhdG9zIHNpbiB0cmF0YXIsIGp1bnRvIGNvbiBsYXMgcmVzcGVjdGl2YXMgY3VydmFzIHN1YXZpemFkYXMuCgpgYGB7cn0KIyBEYXRvcyBlbiBicnV0bwptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gdChkYXRvczEpLCB0eXBlID0gJ3AnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4xLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgICBtYWluID0gJ011ZXN0cmFzIHkgY3VydmFzIHN1YXZpemFkYXMgYXNvY2lhZGFzJywgCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsCiAgICAgICAgY29sID0gJ2JsYWNrJykKCiMgUmVzcGVjdGl2YXMgY3VydmFzIHN1YXZpemFkYXMKbGluZXMoYWp1c3RlLCBsd2QgPSAxLCBjb2wgPSAnbWlkbmlnaHRibHVlJywgbHR5ID0gMSkKbGVnZW5kKGxlZ2VuZCA9IGMoJ1NpbiB0cmF0YXInLCAnU3Vhdml6YWRhcycpLCBsd2QgPSAyLCAKICAgICAgIGNvbCA9IGMoJ2JsYWNrJywgJ21pZG5pZ2h0Ymx1ZScpLCBwY2ggPSBjKDE5LCBOQSksCiAgICAgICBwdC5jZXggPSAwLjIsIHRleHQuY29sID0gYygnYmxhY2snLCAnbWlkbmlnaHRibHVlJyksCiAgICAgICB4ID0gJ3RvcHJpZ2h0JywgYmcgPSAnZ3JheTgyJywgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgbHR5ID0gYyhOQSwgMSkpCmBgYAoKIyMgRnVuY2nDs24gZGUgbWVkaWEKCkxhIGZ1bmNpw7NuIGRlIG1lZGlhICRcb3ZlcmxpbmV7eCh0KX0kIHNlIHByZXNlbnRhIGEgY29udGludWFjacOzbgoKYGBge3J9CiMgIEV4dHJhZW1vcyBsb3Mgb2JqZXRvcyBhanVzdGFkb3MKYWp1c3RlX2RldGFsbGFkbyA8LSBzbW9vdGguYmFzaXMoYXJndmFscyA9IHRfcmFuZ28sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gdChkYXRvczEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRQYXJvYmogPSBiYXNlX2JzcCkKIyBGdW5jaW9uZXMgYWp1c3RhZGFzCmZfaGF0IDwtIGV2YWwuZmQoZXZhbGFyZyA9IHRfcmFuZ28sIAogICAgICAgICAgICAgICAgIGZkb2JqID0gYWp1c3RlX2RldGFsbGFkbyRmZCkKY29sbmFtZXMoZl9oYXQpIDwtIHBhc3RlMCgndicsIDE6bmNvbChmX2hhdCkpCgptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gdChkYXRvczEpLCB0eXBlID0gJ3AnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4yLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgICBtYWluID0gJ01lZGlhIHkgZGF0b3Mgb3JpZ2luYWxlcycsIAogICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgeWxhYiA9ICdGbHVvcmVzZW5jaWEnLAogICAgICAgIGNvbCA9ICdncmF5JykKCiMgQWdyZWdhbW9zIGxhIGZ1bmNpw7NuIGRlIG1lZGlhCnlfbWVkaWEgPC0gYXBwbHkoWCA9IGZfaGF0LCBNQVJHSU4gPSAxLCBtZWFuKQpsaW5lcyh4ID0gdF9yYW5nbywgeSA9IHlfbWVkaWEsIGNvbCA9ICdibGFjaycsIGx3ZCA9IDMpCmxlZ2VuZCh4ID0gJ3RvcHJpZ2h0JywgbGVnZW5kID0gYygnTWVkaWEnLCAnRGF0b3Mgb3JpZ2luYWxlcycpLAogICAgICAgbHdkID0gYygzLCBOQSksIGNvbCA9IGMoJ2JsYWNrJywgJ2dyYXknKSwgCiAgICAgICBsdHkgPSBjKDEsIE5BKSwgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgcGNoID0gMTksIHB0LmNleCA9IGMoTkEsIDAuMikpCgojIEJveHBsb3QgZnVuY2lvbmFsCmZicGxvdChmaXQgPSBmX2hhdCwgeCA9IHRfcmFuZ28sIHlsaW0gPSBjKC0xMCwgNTAwKSwgCiAgICAgICBtYWluID0gJ0JveHBsb3QgZnVuY2lvbmFsJywgeGxpbSA9IHJhbmdlKHRfcmFuZ28pLAogICAgICAgcGxvdCA9IEZBTFNFKSAtPiBicF9mdW5jaW9uYWwKb3JkZXIoYnBfZnVuY2lvbmFsJGRlcHRoKSAtPiBjZW50cmFsZXMKYGBgCgojIyBGdW5jacOzbiBkZSBtZWRpYSByZWNvcnRhZGEgYWwgMTAlCgpWZXJlbW9zIGxhIG1lZGlhIHJlY29ydGFkYSwgcXVlIGNvcnJlc3BvbmRlIGFsIGPDoWxjdWxvIGRlIGxhIG1lZGlhIGRlc3DDumVzIGRlIGhhYmVyIG9taXRpZGEgdW5hIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMgKGVuIGVzdGUsIGVsIDEwJSBkZSBsYXMgb2JzZXJ2YWNpb25lcyAqbWVub3MgY2VudHJhbGVzKikuIFZlbW9zIHF1ZSBsYXMgZnVuY2lvbmVzIG1lbm9zIGNlbnRyYWxlcywgcGFyZWNlbiBtb3N0cmFyIHVuIGNvbXBvcnRhbWllbnRvLCBtw6FzIGFwdW50YWRvcyBlbiBhbGd1bmEgcGFydGUgbyBsYSBwYXJ0ZSBjZW50cmFsIGVuIGx1Z2FyIGRlIHNlciBkZWNyZWNpZW50ZSBjcmVjZS4KCmBgYHtyfQojIERhdG9zIHNpbiBzdWF2aXphcgptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gZl9oYXRbLCBjZW50cmFsZXNbMToyNl1dLCB0eXBlID0gJ2wnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4yLCBmcmFtZSA9IEZBTFNFLCBsdHkgPSAxLCBsd2QgPSAwLjgsCiAgICAgICAgY29sID0gJ2N5YW4yJywgbWFpbiA9ICdNZWRpYSByZWNvcnRhZGEnLCAKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJykKIyBNZWRpYSByZWNvcnRhZGEKeV9tZWRpYXJlYyA8LSBhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6MjZdXSwgTUFSR0lOID0gMSwKICAgICAgICAgICAgICAgICAgICBtZWFuKQoKIyBGdW5jaW9uZXMgZ3JhZmljYWRhcwpsaW5lcyh4ID0gdF9yYW5nbywgeSA9IHlfbWVkaWEsIGNvbCA9ICdibGFjaycsIGx3ZCA9IDIsIAogICAgICBsdHkgPSAyKQpsaW5lcyh4ID0gdF9yYW5nbywgeSA9IHlfbWVkaWFyZWMsIGx3ZCA9IDMsIGNvbCA9ICdyZWQnKQoKIyBJZGVudGlmaWNhbW9zIGNhZGEgY3VydmEKbGVnZW5kKHggPSAndG9wcmlnaHQnLCBsZWdlbmQgPSBjKCdNZWRpYSByZWNvcnRhZGEnLCAnTWVkaWEnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEYXRvcyBubyBjb25zaWRlcmFkb3MnKSwgCiAgICAgICBsd2QgPSBjKDMsIDIsIDAuOCksIGNvbCA9IGMoJ3JlZCcsICdibGFjaycsICdjeWFuMicpLCAKICAgICAgIGx0eSA9IGMoMSwgMiwgMSksIGJveC5jb2wgPSAnd2hpdGUnKSAKYGBgCgojIyBGdW5jacOzbiBkZSB2YXJpYW56YQoKU2UgY2FsY3Vsw7MgdXNhbmRvIHRvZG9zIGxvcyBkYXRvcy4KCmBgYHtyfQojIEZ1bmNpw7NuIGRlIHZhcmlhbnphCmZfdmFyIDwtIGFwcGx5KFggPSBmX2hhdCwgTUFSID0gMSwgRlVOID0gdmFyKQoKIyBHcmFmaWNhbW9zCnBsb3QoeCA9IHRfcmFuZ28sIHkgPSBmX3ZhciwgZnJhbWUgPSBGQUxTRSwgCiAgICAgbWFpbiA9ICdWYXJpYW56YSBlc3RpbWFkYScsIAogICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgdHlwZSA9ICdsJywgeWxhYiA9ICcnKQpgYGAKCiMjIEZ1bmNpw7NuIGRlIGNvdmFyaWFuemEKCk1vc3RyYW1vcyBsYSBzdXBlcmZpY2llIG9idGVuaWRhLiBDb24gbGEgZnVuY2nDs24gKnBlcnNwKiBvYnRlbmVtb3MgdW5hIGZpZ3VyYSBubyBtdXkgYWdyYWRhYmxlLiBTaW4gZW1iYXJnbywgdXNhcmVtb3MgbGEgZnVuY2nDs24gKnBsb3RfbHkqIHF1ZSBncmFmaWNhcsOhIGxhIHN1cGVyZmljaWUgZW4gdW5hIHDDoWdpbmEgd2ViIHkgdG9tYW1vcyBjYXB0dXJhcyBkZSBwYW50YWxsYS4KCkFwcm92ZWNoYW1vcyBwYXJhIHZpc3VhbGl6YXIgbGFzIGZ1bmNpb25lcyBkZSAqdmFyaWFuemEgeSBjb3ZhcmlhbnphKiwgeSBsYSBtYXRyaXogZGUgKmNvcnJlbGFjaW9uZXMqLgoKYGBge3IsIGluY2x1ZGUgPSBUUlVFfQojIEZ1bmNpw7NuIGRlIGF1dG9jb3ZhcmlhbnphCmNvdl9mIDwtIGNvdih0KGZfaGF0KSkKY29yX2YgPC0gY29yKHQoZl9oYXQpKQoKIyBDb3ZhcmlhbnphCmluZF8xIDwtIHNlcShmcm9tID0gMSwgdG8gPSA1NzEsIGJ5ID0gNSkKZzEgPC0gcGxvdF9seSh4ID0gfnRfcmFuZ29baW5kXzFdLCB5ID0gfnRfcmFuZ29baW5kXzFdLCAKICAgICAgICAgICAgICB6ID0gfmNvdl9mW2luZF8xLCBpbmRfMV0sIAogICAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkKZzExIDwtIGcxICU+JSBhZGRfc3VyZmFjZSgpICU+JQogbGF5b3V0KHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnRW1pc2nDs24gZXNwZWN0cmFsJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRW1pc2nDs24gZXNwZWN0cmFsJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAnY292YXJpYW56YScpKSkKcHJpbnQoZzExKQojIENvcnJlbGFjacOzbgpnMiA8LSBwbG90X2x5KHggPSB+dF9yYW5nb1tpbmRfMV0sIHkgPSB+dF9yYW5nb1tpbmRfMV0sIAogICAgICAgICAgICAgIHogPSB+Y29yX2ZbaW5kXzEsIGluZF8xXSwgCiAgICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKQpnMTIgPC0gZzIgJT4lIGFkZF9zdXJmYWNlKCkgJT4lCiBsYXlvdXQoc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdFbWlzacOzbiBlc3BlY3RyYWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdFbWlzacOzbiBlc3BlY3RyYWwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICdDb3JyZWxhY2nDs24nKSkpCnByaW50KGcxMikKYGBgCgohW0NvdmFyaWFuemFdKC4vQ2FwdHVyYXMvY292X3Zpc3RhMS5wbmcpCgohW0NvcnJlbGFjacOzbl0oLi9DYXB0dXJhcy9jb3JfdmlzdGExLnBuZykKCk90cmEgZm9ybWEgZGUgdmlzdWFsaXphcmxvIHNlcsOtYSB1c2FuZG8gbWFwYXMgZGUgY2Fsb3IuIEEgY29udGludWNhY2nDs24KCmBgYHtyfQojIE1hcGFzIGRlIGNhbG9yCnBhcihtZnJvdyA9IGMoMSwgMikpCgojIENvdmFyaWFuemFzCmltYWdlKHggPSB0X3JhbmdvLCB5ID0gdF9yYW5nbywgeiA9IGNvdl9mLCAKICAgICAgbWFpbiA9ICdWYXJpYW56YXMgeSBjb3ZhcmlhbnphcycsIAogICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIAogICAgICB5bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIGZyYW1lID0gRkFMU0UpCgojIENvcnJlbGFjaW9uZXMKaW1hZ2UoeCA9IHRfcmFuZ28sIHkgPSB0X3JhbmdvLCB6ID0gY29yX2YsIAogICAgICBtYWluID0gJ01hdHJpeiBkZSBjb3JyZWxhY2lvbmVzJywgCiAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgCiAgICAgIHlsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgZnJhbWUgPSBGQUxTRSkKYGBgCgojIyBMYSBmdW5jacOzbiBkZSBtZWRpYW5hCgpDb3JyZXNwb25kZSBhIGxhIGVzdGltYWNpw7NuIGNvbiBsYSBtYXlvciBkZW5zaWRhZCBkZSB0b2RhcyBsYXMgZXN0aW1hY2lvbmVzLgoKYGBge3J9CiMgTWVkaWFuYQp5X21lZGlhbmEgPC0gZl9oYXRbLCB3aGljaC5tYXgoYnBfZnVuY2lvbmFsJGRlcHRoKV0KCiMgR3JhZmlxdWVtb3MgbGFzIDMgZnVuY2lvbmVzCm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSBjYmluZCh5X21lZGlhcmVjLCB5X21lZGlhLCB5X21lZGlhbmEpLAogICAgICAgIGx3ZCA9IGMoMSwgMSwgMiksIGNvbCA9IGMoJ2JsYWNrJywgJ2JsdWUnLCAnYnJvd24nKSwgCiAgICAgICAgdHlwZSA9ICdsJywgZnJhbWUgPSBGQUxTRSwgbHR5ID0gMSwgCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsIAogICAgICAgIG1haW4gPSAnTWVkaWRhcyBkZSB0ZW5kZW5jaWEgY2VudHJhbCcpCgpsZWdlbmQoeCA9ICd0b3ByaWdodCcsIGJveC5jb2wgPSAnd2hpdGUnLAogICAgICAgbGVnZW5kID0gYygnTWVkaWFuYScsICdNZWRpYScsICdNZWRpYSByZWNvcnRhZGEnKSwgCiAgICAgICBsd2QgPSBjKDIsIDEsIDEpLCBjb2wgPSBjKCdicm93bicsICdibHVlJywgJ2JsYWNrJykpCmBgYAoKIyMgRnVuY2lvbmVzIGN1YW50aWxlcyA5MCUgeSA5NSUKCkN1YW5kbyB0b21hbW9zIGVsICRwXCUkIGRlIGJhbmRhcyBtw6FzIHByb2Z1bmRhcyB5IGNvbnN0cnVpbW9zIGxhIGJhbmRhLCBmdWVyYSBkZSBsYSBiYW5kYSBxdWVkYSAkKDEtcClcJSQgeSBwb3IgZW5kZSAkXGxlZnQoXGZyYWN7MS1wfXsyfVxyaWdodClcJSQgZW4gbG9zIGV4dHJlbW9zLiBMdWVnbywgbGEgYmFuZGEgbcOheGltYSBjdWJyZSAkXGxlZnQocCArIFxmcmFjezEtcH17Mn1ccmlnaHQpXCYkLiBFcyBkZWNpciwgdGVuZW1vcyB1biBjdWFudGlsIHF1ZSBjdWJyZTogCgokcSA9IFxmcmFjezErcH17Mn0gXGltcGxpZXMgcCA9IDJxIC0gMSQKCkVzIGRlY2lyLCBxdWUgc2kgZXNwZWNpZmljYW1vcyBlbCBjdWFudGlsICRxJCwgcG9kcmVtb3Mgc2FiZXIgY3VhbCBlcyBsYSBiYW5kYSAkcCQgYSBlbGVnaXIuCgpFbnRvbmNlcyB0ZW5lbW9zOgoKKyBBbCBjdWFudGlsICRxX3s5MH0kIGxlIGNvcnJlc3BvbmRlIGxhIHJlZ2nDs24gJHAgPSAwLjgkCisgQWwgY3VhbnRpbCAkcV97OTV9JCBsZSBjb3JyZXNwb25kZSBsYSByZWdpw7NuICRwID0gMC45JAoKRW4gZWwgbWlzbW8gZ3LDoWZpY28gcHJlc2VudGFtb3MgbGFzIGZ1bmNpb25lcyBkZSBsb3MgY3VhbnRpbGVzIHNvbGljaXRhZG9zLgoKYGBge3J9CiMgR3LDoWZpY28gZGUgYmFzZQptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gZl9oYXQsIHR5cGUgPSAnbCcsIAogICAgICAgIHBjaCA9IDE5LCBjZXggPSAwLjIsIGZyYW1lID0gRkFMU0UsIAogICAgICAgIG1haW4gPSAnQ3VhbnRpbGVzJywgbHR5ID0gMSwKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJywKICAgICAgICBjb2wgPSAnZ3JheScpCgpjdWFudF85NSA8LSBhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6MThdXSwgTUFSID0gMSwgbWF4KQptYXRsaW5lcyh4ID0gdF9yYW5nbywgeSA9IGN1YW50Xzk1LCBjb2wgPSAnYmx1ZScsIGx3ZCA9IDMsIAogICAgICAgICBsdHkgPSAxKQoKcDAgPC0gc3VtKGFwcGx5KFggPSBmX2hhdCwgTUFSR0lOID0gMiwgCiAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBhbGwoeCA8PSBjdWFudF85NSkpKQojIEN1YW50aWxlcyA5MCUKY3VhbnRfOTAgPC0gYXBwbHkoWCA9IGZfaGF0WywgLWNlbnRyYWxlc1sxOjUxXV0sIE1BUiA9IDEsIG1heCkKcDEgPC0gc3VtKGFwcGx5KFggPSBmX2hhdCwgTUFSR0lOID0gMiwgCiAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBhbGwoeCA8PSBjdWFudF85MCkpKQoKbWF0bGluZXMoeCA9IHRfcmFuZ28sIHkgPSBjdWFudF85MCwgY29sID0gJ3JlZCcsIGx3ZCA9IDIsIAogICAgICAgICBsdHkgPSAxKQpsZWdlbmQoeCA9ICd0b3ByaWdodCcsIGx3ZCA9IDM6MSwgYm94LmNvbCA9ICd3aGl0ZScsCiAgICAgICBjb2wgPSBjKCdibHVlJywgJ3JlZCcsICdncmF5JyksIAogICAgICAgbGVnZW5kID0gYygnQ3VhbnRpbCA5NSUnLCAnQ3VhbnRpbCA5MCUnLCAnRGF0b3MnKSkKYGBgCgojIyBSZWdpw7NuIGNlbnRyYWwgMC43NQoKYGBge3J9CiMgQmFzZSA6dgptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gZl9oYXQsIHR5cGUgPSAnbCcsIHBjaCA9IDE5LCAKICAgICAgICBjZXggPSAwLjIsIAogICAgICAgIGZyYW1lID0gRkFMU0UsIG1haW4gPSAnUmVnacOzbiAwLjc1JywgbHR5ID0gMSwKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJywKICAgICAgICBjb2wgPSAnd2hpdGUnKQpjdWFudF83NSA8LSBjYmluZChhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6NjddXSwgCiAgICAgICAgICAgICAgICAgICAgICAgIE1BUiA9IDEsIG1pbiksIAogICAgICAgICAgICAgICAgICBhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6NjddXSwgCiAgICAgICAgICAgICAgICAgICAgICAgIE1BUiA9IDEsIG1heCkpCgpwb2x5Z29uKHggPSBjKHRfcmFuZ28sIHRfcmFuZ29bbGVuZ3RoKHRfcmFuZ28pOjFdKSwgCiAgICAgICAgeSA9IGMoY3VhbnRfNzVbLDFdLCAoY3VhbnRfNzVbLDJdKVtsZW5ndGgodF9yYW5nbyk6MV0pLAogICAgICAgIGJvcmRlciA9ICdtaWRuaWdodGJsdWUnLCBhbmdsZSA9IDQ1LCAKICAgICAgICBjb2wgPSAnbWlkbmlnaHRibHVlJywgZGVuc2l0eSA9IDUwKQpgYGAKCiMjIEJveHBsb3QgZnVuY2lvbmFsIHkgb3V0bGllcnMKCkxvcyBuw7ptZXJvcyBxdWUgYXBhcmVjZW4gZW4gbGEgbGV5ZW5kYSBzb24gbG9zIGlkZW50aWZpY2Fkb3JlcyBkZSBsYXMgZnVuY2lvbmVzICRcd2lkZWhhdHt4fSQgY29uc2lkZXJhZGFzIGNvbW8gYXTDrXBpY2FzLiBFbiBlc3RlIGNhc28sIHBvZGVtb3MgY29uc2lkZXJhciBxdWUgc2UgdHJhdGFuIGRlICpvdXRsaWVycyBwYXJjaWFsZXMqLiBMYXMgb2JzZXJ2YWNpb25lcyAxMzEsIDcxIHkgMTAsIHRpZW5lbiB1bmEgcmVnacOzbiAgKGludGVydmFsbyAzNTAtNDUwIGFwcm94aW1hZGFtZW50ZSkgZW4gbGEgcXVlIGxhcyBjdXJ2YXMgbyBiaWVuIGRlY3JlY2VuIGRlIGZvcm1hIG11eSBzdWF2ZSBvIGJpZW4gc2UgY29tcG9ydGFuIGRlIGZvcm1hIGNyZWNpZW50ZSAoY29udHJhcmlvIGFsIGJveHBsb3QgcXVlIHRlbmVtb3MgZGUgZm9uZG8pLiAKCmBgYHtyfQojIEJveHBsb3QgZnVuY2lvbmFsCmZicGxvdChmaXQgPSBmX2hhdCwgeCA9IHRfcmFuZ28sIHlsaW0gPSBjKC0xMCwgNTAwKSwgCiAgICAgICBmcmFtZSA9IEZBTFNFLCBtYWluID0gJ0JveHBsb3QgZnVuY2lvbmFsJywgCiAgICAgICB4bGltID0gcmFuZ2UodF9yYW5nbyksIG91dGxpZXJjb2wgPSAnd2hpdGUnLCAKICAgICAgIGJhcmNvbCA9IGFkanVzdGNvbG9yKCdtaWRuaWdodGJsdWUnLCBhbHBoYS5mID0gMC4yKSwgCiAgICAgICBjb2xvciA9IGFkanVzdGNvbG9yKCdicm93bicsIGFscGhhLmYgPSAwLjIpLAogICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCAKICAgICAgIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJykgLT4gYnBfZnVuY2lvbmFsCgptYXRsaW5lcyh4ID0gdF9yYW5nbywgeSA9IGZfaGF0WywgYnBfZnVuY2lvbmFsJG91dHBvaW50XSwgCiAgICAgICAgIGx0eSA9IDEsICBsd2QgPSAzLCAKICAgICAgICAgY29sID0gYygnYmx1ZTQnLCAnZGVlcHBpbms0JywgJ2luZGlhbnJlZDQnKSkKCmxlZ2VuZChsZWdlbmQgPSBicF9mdW5jaW9uYWwkb3V0cG9pbnQsIHggPSAndG9wcmlnaHQnLCBsd2QgPSAzLAogICAgICAgY29sID0gYygnYmx1ZTQnLCAnZGVlcHBpbms0JywgJ2luZGlhbnJlZDQnKSwgCiAgICAgICBuY29sID0gMiwgY2V4ID0gMC44LCBib3guY29sID0gJ3doaXRlJywgCiAgICAgICBsdHkgPSAxLCBiZyA9ICdhenVyZTEnKQpgYGAKCiMjIEJveHBsb3QgZnVuY2lvbmFsIGFqdXN0YWRvIHkgb3V0bGllcnMKCjEuIERlYmlkbyBhIGxhcyBkaWZpY3VsdGFkZXMgcXVlIGVuY29udHJhbW9zIHBhcmEgaW1wbGVtZW50YXIgbGEgZXN0aW1hY2nDs24gZGUgbGEgKm1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyByb2J1c3RhKiB1c2Ftb3MgZG9zIGZvcm1hcy4gUHJpbWVybyBjb24gZWwgcGFxdWV0ZSAqcm9haGQqLgoKTGEgdGFzYSBwb3NpdGl2YSBkZSBvdXRsaWVycyBxdWUgdXNhbW9zIGZ1ZSBkZSA5OS43JS4KCmBgYHtyfQojIExpYnJlcsOtYSBlc3BlY2lhbApsaWJyYXJ5KHJvYWhkKQpzZXQuc2VlZCgzMTQpCgojIEVzdHJ1Y3R1cmEKZl9kIDwtIGZEYXRhKGdyaWQgPSB0X3JhbmdvLCB2YWx1ZXMgPSB0KGZfaGF0KSkKcGJmXzEgPC0gZmJwbG90KERhdGEgPSBmX2QsIERlcHRocyA9ICdNQkQnLCAKICAgICAgICAgICAgICAgIGFkanVzdCA9IGxpc3QoTl90cmlhbHMgPSAxLCB0cmlhbF9zaXplID0gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUFIgPSAwLjAwMDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZfbWF4ID0gMiksIGRpc3BsYXkgPSBGQUxTRSkKZiA8LSBwYmZfMSRGdmFsdWUKYGBgCgpDb24gbG8gcXVlIG9idHV2aW1vcyB1biB2YWxvciBwYXJhIGVsIGhpcGVycGFyw6FtZXRybyAqRiogZGUgYHIgcm91bmQoZiwgNClgLgoKYGBge3J9CnBhcihtZnJvdyA9IGMoMiwgMikpCm91dF8yIDwtIGxpc3QoeDEgPSBjKDEsIDgsIDkpLAogICAgICAgICAgICAgIHgyID0gYygyLCA0LCAxMCksCiAgICAgICAgICAgICAgeDMgPSBjKDMsIDU6NykpCmNvbCA8LSBjKCdibHVlNCcsICdicm93bicsICdncmF5NDUnKSAKCmZvcihpIGluIDE6bGVuZ3RoKG91dF8yKSl7CmJwX2YxIDwtIGZkYTo6ZmJwbG90KGZpdCA9IGZfaGF0LCB4ID0gdF9yYW5nbywgeWxpbSA9IGMoLTEwLCA1MDApLCAKICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSBGQUxTRSwgbWFpbiA9ICdCb3hwbG90IGZ1bmNpb25hbCcsIAogICAgICAgICAgICAgICAgICAgICB4bGltID0gcmFuZ2UodF9yYW5nbyksIGZhY3RvciA9IGYsCiAgICAgICAgICAgICAgICAgICAgIGJhcmNvbCA9IGFkanVzdGNvbG9yKCdtaWRuaWdodGJsdWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEuZiA9IDAuMSksIAogICAgICAgICAgICAgICAgICAgICBvdXRsaWVyY29sID0gJ3doaXRlJywKICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhZGp1c3Rjb2xvcignYnJvd24nLCBhbHBoYS5mID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCAKICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICdGbHVvcmVzZW5jaWEnKQoKbWF0bGluZXMoeCA9IHRfcmFuZ28sIHkgPSBmX2hhdFssIGJwX2YxJG91dHBvaW50WyBvdXRfMltbaV1dXSBdLAogICAgICAgICBsd2QgPSAyLAogICAgICAgICBsdHkgPSAxOjQsCiAgICAgICAgIGNvbCA9IGNvbFtpXSkKbGVnZW5kKHggPSAndG9wcmlnaHQnLCBsZWdlbmQgPSBicF9mMSRvdXRwb2ludFtvdXRfMltbaV1dXSwgbHR5ID0gMTo0LCAKICAgICAgIGx3ZCA9IDIsIGNvbCA9IGNvbFtpXSwgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgYmcgPSAnYXp1cmUxJykKfQoKYGBgCgpWZW1vcyBxdWUgYWp1c3RhbmRvIGVsIGZhY3Rvciwgb2J0ZW5lbW9zIGxvcyAzIG91dGxpZXJzIGRlIGFudGVzIChvdXRsaWVycyBwYXJjaWFsZXMpLiBEZSBpZ3VhbCBmb3JtYSwgbG9zIGRhdG9zIDEzLCAxNSB5IDI2OCB0YW1iacOpbiByZXN1bHRhbiBzZXIgb3V0bGllcnMgcGFyY2lhbGVzLCBwdWVzIHZlbW9zIHF1ZSBlbiBjaWVydGFzIHJlZ2lvbmVzIHNlIGNvbXBvcnRhbiBkZSBmb3JtYSBkaXN0aW50YSBhbCByZXN0byBkZSBmdW5jaW9uZXMuIEZpbmFsbWVudGUgc2Ugb2J0aWVuZW4gbG9zIG91dGxpZXJzIGNvcnJlc3BvbmRpZW50ZXMgYSBsb3MgZGF0b3MgMTQsIDE2LCAxNyB5IDM4LiBFc3RvcyDDumx0aW1vcyBlcyBtw6FzIGRpZsOtY2lsIGRlIGp1c3RpZmljYXIgY29uIHVuYSBzaW1wbGUgdmlzdWFsaXphY2nDs24sIHB1ZXMgZW4gbGFzIHBhcnRlcyBlbiBkb25kZSBzYWxlbiBkZWwgYm94cGxvdCBzb24gbXV5IHBvY2FzIHkgcGVxdWXDsWFzLgoKc29sbyBvYnRlbmVtb3MgMyBkYXRvcyBhdMOtcGljb3MuIEp1c3RhbWVudGUgbG9zIDMgZGF0b3MgcXVlIGhhYsOtYW1vcyBjYXRhbG9nYWRvcyBjb21vIG91dGxpZXJzIHBhcmNpYWxlcyAoeSBxdWUgZW4gY2llcnRhIG1lZGlkYSwgZXJhIG3DoXMgc2VuY2lsbG8ganVzdGlmaWNhciBwb3JxdcOpIGVyYW4gb3V0bGllcnMpLgoKMi4gQ29tbyBhbHRlcm5hdGl2YSwgcHJvcG9uZW1vcyBiYXNhcm5vcyBlbiB0w6ljbmljYXMgZGUgcmVtdWVzdHJlbyBwYXJhIGVzdGltYXIgZWwgYm94cGxvdCBzaW4gdXNhciBsb3MgcXVlIHBhcmVjZW4gc2VyIGRhdG9zIGF0w61waWNvcyAoZXMgZGVjaXIsIHNpbiBjb25zaWRlcmFyIGxvcyA1IGRhdG9zIHF1ZSBjb25zaWRlcmFiYW1vcyBjb21vIG91dGxpZXJzKSB5IGRlZmluaXIgZWwgdmFsb3IgZGVsICpoaXBlcnBhcsOhbWV0cm8qIEYuCgpMb3MgZ3LDoWZpY29zIG5vcyBheXVkYW4gYSB2ZXIgZWwgZWZlY3RvIGRlIGhhYmVyIGNhbWJpYWRvIGVsIGZhY3RvciAkRiQgZGUgMS41IGEgMS43NCB5IHZlbW9zIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSBkYXRvcyBjYXRhbG9nYWRvcyBjb21vIGF0w61waWNvcyBjdWFuZG8gbm8gbG8gc29uIHBhc2EgZGUgdW4gNSUgYSB1biAyJS4KCmBgYHtyfQojIEZpamFtb3Mgc2VtaWxsYQpzZXQuc2VlZCgyKQoKIyDDjW5kaWNlcyBzb2JyZSBsb3MgcXVlIHZhbW9zIGEgbXVlc3RyZWFyCmluZCA8LSAoMTpuY29sKGZfaGF0KSlbLWJwX2Z1bmNpb25hbCRvdXRwb2ludF0KCiMgUmVtdWVzdHJlbwpyZW0gPC0gc2FtcGxlKHggPSBpbmQsIHNpemUgPSAxMDAsIHJlcGxhY2UgPSBUUlVFKQoKIyBTZWxlY2Npw7NuIGRlIG9ic2VydmFjaW9uZXMKZl9yZW0gPC0gZl9oYXRbLCByZW1dCgojIEJveHBsb3QKcGFyKG1mcm93ID0gYygxLCAyKSkKZmRhOjpmYnBsb3QoZl9yZW0sIHggPSB0X3JhbmdvLCB4bGltID0gcmFuZ2UodF9yYW5nbyksIAogICAgICAgICAgICB5bGltID0gYygtNSwgNTAwKSwgZnJhbWUgPSBGQUxTRSwgCiAgICAgICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgY2V4LmF4aXMgPSAwLjcsCiAgICAgICAgICAgIGNleC5sYWIgPSAwLjcsCiAgICAgICAgICAgIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJywgCiAgICAgICAgICAgIG1haW4gPSAnUmVtdWVzdHJlbycpJG91dHBvaW50CmxlZ2VuZCh4ID0gJ3RvcHJpZ2h0JywgbGVnZW5kID0gJ091dGxpZXJzOiA1JScsIAogICAgICAgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgYmcgPSAnY3lhbjInLCBjZXggPSAwLjcpCgojIENhbWJpYW1vcyBsb3MgZmFjdG9yZXMKZmRhOjpmYnBsb3QoZl9yZW0sIHggPSB0X3JhbmdvLCB4bGltID0gcmFuZ2UodF9yYW5nbyksIAogICAgICAgICAgICB5bGltID0gYygtNSwgNTAwKSwgZnJhbWUgPSBGQUxTRSwgCiAgICAgICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgZmFjdG9yID0gMS43NCwKICAgICAgICAgICAgY2V4LmF4aXMgPSAwLjcsIGNleC5sYWIgPSAwLjcsIAogICAgICAgICAgICB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsIAogICAgICAgICAgICBtYWluID0gJ1JlYWp1c3RlIGRlIGZhY3RvciBGJykkb3V0cG9pbnQKbGVnZW5kKHggPSAndG9wcmlnaHQnLCBsZWdlbmQgPSAnT3V0bGllcnM6IDIlJywgCiAgICAgICBib3guY29sID0gJ3doaXRlJywKICAgICAgIGJnID0gJ2N5YW4yJywgY2V4ID0gMC43KQpgYGAKCk1vc3RyYW1vcyBhIGNvbnRpbnVhY2nDs24gZWwgYm94cGxvdCByZXN1bHRhbnRlIGFsIG1vZGlmaWNhciBlbCBmYWN0b3IgRi4KCmBgYHtyfQojIEJveHBsb3QgZnVuY2lvbmFsCnBhcihtZnJvdyA9IGMoMSwgMSkpCmZkYTo6ZmJwbG90KGZpdCA9IGZfaGF0LCB4ID0gdF9yYW5nbywgeWxpbSA9IGMoLTEwLCA1MDApLCAKICAgICAgIGZyYW1lID0gRkFMU0UsIG1haW4gPSAnQm94cGxvdCBmdW5jaW9uYWwgYWp1c3RhZG8nLCAKICAgICAgIHhsaW0gPSByYW5nZSh0X3JhbmdvKSwgZmFjdG9yID0gMS43NCwKICAgICAgIG91dGxpZXJjb2wgPSAnd2hpdGUnLCAKICAgICAgIGJhcmNvbCA9IGFkanVzdGNvbG9yKCdtaWRuaWdodGJsdWUnLCBhbHBoYS5mID0gMC4yKSwgCiAgICAgICBjb2xvciA9IGFkanVzdGNvbG9yKCdicm93bicsIGFscGhhLmYgPSAwLjIpLAogICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCAKICAgICAgIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJykgLT4gYnBfZnVuY2lvbmFsMQptYXRsaW5lcyh4ID0gdF9yYW5nbywgeSA9IGZfaGF0WywgYnBfZnVuY2lvbmFsMSRvdXRwb2ludF0sIGx0eSA9IDEsIAogICAgICAgICBsd2QgPSAzLCBjb2wgPSBjKCdibHVlNCcsICdkZWVwcGluazQnKSkKbGVnZW5kKGxlZ2VuZCA9IGJwX2Z1bmNpb25hbDEkb3V0cG9pbnQsIHggPSAndG9wcmlnaHQnLCBsd2QgPSAzLAogICAgICAgY29sID0gYygnYmx1ZTQnLCAnZGVlcHBpbms0JyksIAogICAgICAgY2V4ID0gMC44LCBib3guY29sID0gJ3doaXRlJywgbHR5ID0gMSwKICAgICAgIGJnID0gJ2F6dXJlMScpCmBgYAoKQXVucXVlIHBhcmVjZSBtw6FzIGFjZXJ0YWRhIGxhIHNhbGlkYSBkZSBsYSBmdW5jacOzbiAqKnJvYWhkOjpmYnBsb3QqKiB1c2FuZG8gZWwgcGFyw6FtZXRybyAqYWRqdXN0Ki4KCiMjIExhIGZ1bmNpw7NuIG1lZGlhbmEgbXVsdGl2YXJpYWRhCgpFbCBuaXZlbCBkZSBleGNpdGFjacOzbiBxdWUgaGFiw61hbW9zIGVsZWdpZG8gaW5pY2FsbWVudGUgZnVlIGRlIDM0MC4gUGFyYSBsbGV2YXIgYSBjYWJvIGxvcyBwcm9jZWRpbWllbnRvcyBtdWx0aXZhcmlhZG9zLCB0b21hbW9zIG90cm8gbml2ZWwgZGUgb25kYSBjb3JyZXNwb25kaWVudGUgYWwgdmFsb3IgMzI1LiAKCkVzIGRlY2lyIHF1ZSB0ZW5lbW9zIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGZ1bmNpb25hbGVzIGJpdmFyaWFkby4gVmVhbW9zIHLDoXBpZGFtZW50ZSBlbCBudWV2byBjb25qdW50byBkZSBkYXRvcyB5IGxvcyBzdWF2aXphbW9lbnRvcyBjb3JyZXNwb25kaWVudGVzLgoKYGBge3J9CiMgSGFjZW1vcyBsYSBsZWN0dXJhIGRlIGxvcyBkYXRvcwpkYXRvczIgPC0gcmVhZC50YWJsZShjb2xDbGFzc2VzID0gcmVwKGMoJ05VTEwnLCAnbnVtZXJpYycsICdOVUxMJyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoNSwgMSwgMSkqNTcxKSwgZmlsZSA9IHJ1dGEpCgojIFZpc3VhbGl6YWNpb25lcwpwYXIobWZyb3cgPSBjKDEsIDIpKQoKbWF0cGxvdCh4ID0gdF9yYW5nbywgeSA9IHQoZGF0b3MyKSwgdHlwZSA9ICdsJywgZnJhbWUgPSBGQUxTRSwKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIEVzcGVjdHJhbCcsIG1haW4gPSAnTml2ZWwgMzI1JywgeWxhYiA9ICcnKQoKIyBBanVzdGUKYmsyIDwtIGMoMjc1LCAzMDAsIDMzMCwgMzcwLCA0MDAsIDQzMCwgNDcwLCA1MDAsIDUyMCwgNTYwKQpiYXNlX2JzcDIgPC0gY3JlYXRlLmJzcGxpbmUuYmFzaXMoYnJlYWtzID0gYmsyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcmRlciA9IDQpCmFqdXN0ZV9kZXRhbGxhZG8yIDwtIHNtb290aC5iYXNpcyhhcmd2YWxzID0gdF9yYW5nbywgeSA9IHQoZGF0b3MyKSwgZmRQYXJvYmogPSBiYXNlX2JzcDIpCgpmX2hhdDIgPC0gZXZhbC5mZChldmFsYXJnID0gdF9yYW5nbywgZmRvYmogPSBhanVzdGVfZGV0YWxsYWRvMiRmZCkKCm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSBmX2hhdDIsIHR5cGUgPSAnbCcsIGZyYW1lID0gRkFMU0UsCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBFc3BlY3RyYWwnLCBtYWluID0gJ0N1cnZhcyBTdWF2aXphZGFzJywKICAgICAgICB5bGFiID0gJycpCgojIFBhc2Ftb3MgYSBkYXRvcyBtdWx0aXYKbXVsdGkgPC0gbWZEYXRhKGdyaWQgPSB0X3JhbmdvLCBEYXRhX2xpc3QgPSBsaXN0KFgxID0gdChmX2hhdCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDIgPSB0KGZfaGF0MikpKQoKIyBNZWRpYW5hIG11bHRpdgptZWRpYW5hX211bHRpIDwtIG1lZGlhbl9tZkRhdGEobWZEYXRhID0gbXVsdGkpCm1lZGlhbmFfcG9zIDwtIHdoaWNoLm1heChtdWx0aU1CRChtdWx0aSkpCmBgYAoKRWwgZ3LDoWZpY28gcmVzcGVjdGl2byBkZSBsYSBtZWRpYW5hIG11bHRpdmFyaWFkYToKCmBgYHtyfQpwbG90KG1lZGlhbmFfbXVsdGksIG1haW4gPSAnTWVkaWFuYSBtdWx0aXZhcmlhZGEsIElEIDE3NScsIAogICAgIGZyYW1lID0gRkFMU0UsCiAgICAgbHdkID0gMiwgY29sID0gJ2dyYXknKQpgYGAKCiMjIE91dGxpZXJzIG11bHRpdmFyaWFkb3MKCk1vc3RyYW1vcyBsb3MgaWRlbnRpZmljYWRvcmVzIGRlIGxvcyBpbmRpdmlkdW9zIHF1ZSBhcGFyZWNlbiBjb21vIGF0w61waWNvcy4gCgpgYGB7cn0KcGFyKG1mcm93ID0gYygxLCAxKSkKZmJwbG90KG11bHRpLCBmcmFtZSA9IEZBTFNFKSAtPiBicF9tdWx0aQoKYnBfbXVsdGkkSURfb3V0bGllcnMKCmRldGFjaCgncGFja2FnZTpyb2FoZCcsIHVubG9hZCA9IFRSVUUpCmBgYAoKQ29tbyB2ZW1vcywgbG9zIGluZGl2aWR1b3MgMTAsIDcxIHkgMTMxIGFwYXJlY2VuIG51ZXZhbWVudGUgY29tbyBkYXRvcyBhdMOtcGljb3MgKGHDum4gY29uc2lkZXJhbmRvIGxvcyBkYXRvcyBtdWx0aXZhcmlhZG9zKS4gU2luIGVtYmFyZ28gbm9zIGxsYW3DsyBsYSBhdGVuY2nDs24gcXVlIGVsIGluZGl2aWR1byAxNSBubyBmdWVzZSB1biBvdXRsaWVyIGEgbml2ZWwgbXVsdGl2YXJpYWRvIHBlcm8gbG9zIGluZGl2aWR1b3MgMTQgeSAxNiBzaS4KCgojIEFydMOtY3VsbzogQ29tcGFyYXRpdmUgc3R1ZHkgb2YgZGlmZmVyZW50IEItc3BsaW5lIGFwcHJvYWNoZXMgZm9yIGZ1bmN0aW9uYWwgZGF0YSB7LnRhYnNldH0KCgoqKlJlZmVyZW5jaWEgZGVsIGFydMOtY3VsbzoqKgpBZ3VpbGVyYSwgQS4gTS4sICYgQWd1aWxlcmEtTW9yaWxsbywgTS4gQy4gKDIwMTMpLiBDb21wYXJhdGl2ZSBzdHVkeSBvZgpkaWZmZXJlbnQgQi1zcGxpbmUgYXBwcm9hY2hlcyBmb3IgZnVuY3Rpb25hbCBkYXRhLiBNYXRoZW1hdGljYWwgYW5kCkNvbXB1dGVyIE1vZGVsbGluZywgNTgoNy04KSwgMTU2OC0xNTc5LgoKU2lndWllbmRvIGxhIGNvbnRydWNjacOzbiBkZWwgYXJ0w61jdWxvIGRlIEFndWlsZXJhLCBzZSBnZW5lcmFuIGxvcyBkYXRvcyBzaW11bGFkb3MsIGdlbmVyYW5kbyAxMDAgY3VydmFzIGRlIHVuIHByb2Nlc28gZXN0b2PDoXN0aWNvIGRlIG1lZGlhIGNlcm8gcXVlIHNpZ3VlIHF1ZSBjYWRhIGN1cnZhIFgsIHBvc2VlIHVuIGNvbXBvcnRhbWllbnRvIGRhZG8gcG9yICRYICh0KT1SIGNvcyAoMlxwaSB0KyBcdGhldGEpJCwgZW4gZWwgY3VhbCAkUiQgeSAkXHRoZXRhJCBwcm92aWVuZW4gZGUgdW5hIGRpc3RyaWJ1Y2nDs24gIGkuaS5kIFJheWxlaWdoKCRcc2lnbWEkKSwgY29uICRcc2lnbWE9MC4zJCB5IFVuaWZvcm1lICRbMCwyXHBpXSQsIHJlc3BlY3RpdmFtZW50ZS4KClNlIHJlYWxpemEgdW5hIG11ZXN0cmEgZGUgb2JzZXJ2YWNpb25lcyBjb24gNTEgbm9kb3MgKGtub3RzKSBpZ3VhbG1lbnRlIGVzcGFjaWFkb3MgZW4gZWwgaW50ZXJ2YWxvICRUPVswLDFdJCwgZW4gZWwgY3VhbCBsb3MgZXJyb3JlcyBkZSBjYWRhIGN1cnZhIHNlIGNvbXBvcnRhbiBkZSBtYW5lcmEgJE5vcm1hbCgwLFxzaWdtYcKyKSQgY29uICRcc2lnbWHCsj0wLjA3JAoKCgoKYGBge3J9ClI8LXJyYXlsZWlnaCgxLCBzY2FsZSA9IHNxcnQoMC4zKSkKdGhldGE8LXJ1bmlmKDEsMCwyKnBpKQpgYGAKCgoKYGBge3J9CiMgU2UgY3JlYSBsYSBmdW5jacOzbiBxdWUgZ2VuZXJhIGxhcyBzaW11bGFjaW9uZXMKdHJ1ZV9mdW5jdGlvbnMgPC0gZnVuY3Rpb24oeCl7Uipjb3MoMipwaSp4K3RoZXRhKX0KdHJ1ZV9mdW5jdGlvbnNfMiA8LSBmdW5jdGlvbih4LFJfaW4sdGhldGFfaW4pe1JfaW4qY29zKDIqcGkqeCt0aGV0YV9pbil9CgpgYGAKCmBgYHtyfQoKI1NlIGdlbmVyYSBsYSBmdW5jacOzbiBxdWUgYnJpbmRhIGxvcyB2YWxvcmVzIHBhcmEgZ2VuZXJhciBsYSBzaW11bGFjacOzbiBjb24gbG9zIGVycm9yZXMgcHJvcHVlc3RvcyBlbiBlbCBhcnTDrWN1bG8Kc2ltdWxhdGVkX2Z1bmN0aW9ucyA8LSBmdW5jdGlvbihsZW5naHQub3V0PTUxLFJfaW4sdGhldGFfaW4pewplcnJvcnM8LXJub3JtKGxlbmdodC5vdXQsbWVhbiA9IDAsIHNkPXNxcnQoMC4wNykpCmxlbmdfdGltZT1zZXEoMCwxLGxlbj1sZW5naHQub3V0KQp2YWx1ZXM8LVJfaW4qY29zKDIqcGkqbGVuZ190aW1lK3RoZXRhX2luKStlcnJvcnMKCnJldHVybih2YWx1ZXMpCiAgfQpgYGAKCioqUmVncmVzc2lvbiBTcGxpbmVzKioKTGEgcHJpbWVyYSBjdXJ2YSBhIHBhcnRpciBkZSB1biAkUiQgeSAkXHRoZXRhJCBhbGVhdG9yaW8gc2UgY29uc3RydXllLCBzaWd1aWVuZG8gbGFzIGRvcyBiYXNlcyBkZSBudWVzdHJvIGludGVyw6lzLiBUYW50byBGb3VyaWVyIGNvbW8gQi1TcGxpbmVzCgpgYGB7cn0Kc2ltdWxhdGVkX2N1cnZlPC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9c2ltdWxhdGVkX2Z1bmN0aW9ucyhSX2luPVIsdGhldGFfaW49dGhldGEpLGNhdD0iU2ltdWxhdGVkIGZ1bmN0aW9uIikKYGBgCgoKCmBgYHtyfQpjcmVhdGVfcmVncmVzc2lvbjwtZnVuY3Rpb24obmJhc2lzLGN1cnZlKXsKICBiYXNpc29iaiA9IGNyZWF0ZS5ic3BsaW5lLmJhc2lzKGMoMCwxKSxuYmFzaXMpCiAgYWp1c3RlIDwtIERhdGEyZmQoeSA9IGN1cnZlJHksIGJhc2lzb2JqID1iYXNpc29iaiwgCiAgICAgICAgICAgICAgICAgIGFyZ3ZhbHMgPSBzZXEoMCwxLGxlbj01MSkpCiAgZGYgPC0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSwgeSA9IHByZWRpY3QoYWp1c3RlLCBuZXdkYXRhPXNlcSgwLDEsbGVuPTUxKSksY2F0PXBhc3RlKGFzLmNoYXJhY3RlcihuYmFzaXMpLCJiYXNpYyBrbm90cyIpKQogIHJldHVybihkZikKfQoKcmVnXzU8LWNyZWF0ZV9yZWdyZXNzaW9uKDUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMTU8LWNyZWF0ZV9yZWdyZXNzaW9uKDE1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzI1PC1jcmVhdGVfcmVncmVzc2lvbigyNSxzaW11bGF0ZWRfY3VydmUpCmBgYAoKCgoKYGBge3J9CmNyZWF0ZV9yZWdyZXNzaW9uX2ZvdXJpZXI8LWZ1bmN0aW9uKG5iYXNpcyxjdXJ2ZSl7CiAgYmFzaXNvYmogPSBjcmVhdGUuZm91cmllci5iYXNpcyhyYW5nZXZhbD1jKDAsMSksIG5iYXNpcz1uYmFzaXMpCiAgYWp1c3RlIDwtIERhdGEyZmQoeSA9IGN1cnZlJHksIGJhc2lzb2JqID1iYXNpc29iaiwgCiAgICAgICAgICAgICAgICAgIGFyZ3ZhbHMgPSBzZXEoMCwxLGxlbj01MSkpCiAgZGYgPC0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSwgeSA9IHByZWRpY3QoYWp1c3RlLCBuZXdkYXRhPXNlcSgwLDEsbGVuPTUxKSksY2F0PXBhc3RlKGFzLmNoYXJhY3RlcihuYmFzaXMpLCJiYXNpYyBrbm90cyIpKQogIHJldHVybihkZikKfQoKcmVnXzVfZjwtY3JlYXRlX3JlZ3Jlc3Npb25fZm91cmllcig1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzE1X2Y8LWNyZWF0ZV9yZWdyZXNzaW9uX2ZvdXJpZXIoMTUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMjVfZjwtY3JlYXRlX3JlZ3Jlc3Npb25fZm91cmllcigyNSxzaW11bGF0ZWRfY3VydmUpCmBgYAoKCgpzZSBjcmVhIGxhIGJhc2UgcGFyYSBsYSBjb25zdHJ1Y2Npw7NuIGRlIHJlZ3Jlc2lvbmVzIHNwbGluZXMgeSBzbW9vdGhpbmcgc3BsaW5lcywgZ2VuZXJhZGFzIGEgcGFydGlyIGRlIGJhc2VzIEItU3BsaW5lcyB5IEJhc2VzIGRlIEZvdXJpZXIsIHJlc3BlY3RpdmFtZW50ZSwgY29uIDUxIG5vZG9zIGVuIGVsIGludGVydmFsbyAkVD1bMCwxXSQKYGBge3J9CnBfcmVnX2I8LWdncGxvdChkYXRhLmZyYW1lKHg9YygwLDEpLGNhdD0iVHJ1ZSBmdW5jdGlvbiIpLCBhZXMoeD14LGNvbG91cj1jYXQpKSArIHN0YXRfZnVuY3Rpb24oZnVuPXRydWVfZnVuY3Rpb25zKSsgZ2VvbV9saW5lKGRhdGEgPSBzaW11bGF0ZWRfY3VydmUsbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzUsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzE1LGxpbmV0eXBlID0gImxvbmdkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzI1LGxpbmV0eXBlID0gImRvdGRhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJDdXJ2ZXMiLCB2YWx1ZXMgPSBjKCJUcnVlIGZ1bmN0aW9uIj0iYmxhY2siLCJTaW11bGF0ZWQgZnVuY3Rpb24iID0gIm9yYW5nZSIsICI1IGJhc2ljIGtub3RzIiA9ICJibHVlIiwiMTUgYmFzaWMga25vdHMiPSJyZWQiLCIyNSBiYXNpYyBrbm90cyI9ImdyZWVuIikpKyB0aGVtZV9idygpK3hsYWIoIkJhc2UgQi1TcGxpbmUiKQpwX3JlZ19mPC1nZ3Bsb3QoZGF0YS5mcmFtZSh4PWMoMCwxKSxjYXQ9IlRydWUgZnVuY3Rpb24iKSwgYWVzKHg9eCxjb2xvdXI9Y2F0KSkgKyBzdGF0X2Z1bmN0aW9uKGZ1bj10cnVlX2Z1bmN0aW9ucykrIGdlb21fbGluZShkYXRhID0gc2ltdWxhdGVkX2N1cnZlLGxpbmV0eXBlID0gImRvdHRlZCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKyBnZW9tX2xpbmUoZGF0YSA9IHJlZ181X2YsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzE1X2YsbGluZXR5cGUgPSAibG9uZ2Rhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMjVfZixsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQ3VydmVzIiwgdmFsdWVzID0gYygiVHJ1ZSBmdW5jdGlvbiI9ImJsYWNrIiwiU2ltdWxhdGVkIGZ1bmN0aW9uIiA9ICJvcmFuZ2UiLCAiNSBiYXNpYyBrbm90cyIgPSAiYmx1ZSIsIjE1IGJhc2ljIGtub3RzIj0icmVkIiwiMjUgYmFzaWMga25vdHMiPSJncmVlbiIpKSsgdGhlbWVfYncoKSt4bGFiKCJCYXNlIEZvdXJpZXIiKQpwX3JlZ19iL3BfcmVnX2YKYGBgCgoKCgoKCgoKCgpgYGB7cn0Kc2FtcGxlc19yZWdyZXNzaW9uPC1mdW5jdGlvbihuYmFzaXNfaW4pewogUl9hdXg8LXJyYXlsZWlnaCgxLCBzY2FsZSA9IHNxcnQoMC4zKSkKIHRoZXRhX2F1eDwtcnVuaWYoMSwwLDIqcGkpCiBzaW11bGF0ZWRfY3VydmVfYXV4PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9c2ltdWxhdGVkX2Z1bmN0aW9ucyhSX2luPVJfYXV4LHRoZXRhX2luPXRoZXRhX2F1eCksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKQogcmV0dXJuKGxpc3QoY3JlYXRlX3JlZ3Jlc3Npb24obmJhc2lzX2luLHNpbXVsYXRlZF9jdXJ2ZV9hdXgpKSkKfQoKYGBgCgoKYGBge3J9CnNhbXBsZXNfcmVnXzU8LWxpc3QoKQpzYW1wbGVzX3JlZ18xNTwtbGlzdCgpCnNhbXBsZXNfcmVnXzI1PC1saXN0KCkKZm9yKGkgaW4gMToxMDApewogIHNhbXBsZXNfcmVnXzU8LWFwcGVuZChzYW1wbGVzX3JlZ181LGxpc3Qoc2FtcGxlc19yZWdyZXNzaW9uKDUpKSkKICBzYW1wbGVzX3JlZ18xNTwtYXBwZW5kKHNhbXBsZXNfcmVnXzE1LGxpc3Qoc2FtcGxlc19yZWdyZXNzaW9uKDE1KSkpCiAgc2FtcGxlc19yZWdfMjU8LWFwcGVuZChzYW1wbGVzX3JlZ18yNSxsaXN0KHNhbXBsZXNfcmVncmVzc2lvbigyNSkpKQp9CmBgYAoKCgoqKlNtb290aGluZyBTcGxpbmVzKioKCmBgYHtyfQpjcmVhdGVfc21fc3BsaW5lczwtZnVuY3Rpb24obmJhc2lzLGN1cnZlLGQ9MixsYW1iZGE9MTBeKC0yKSl7CiAgYmFzaXNvYmogPSBjcmVhdGUuYnNwbGluZS5iYXNpcyhjKDAsMSksbmJhc2lzKQogIGZkUGFyb2JqID0gZmRQYXIoYmFzaXNvYmosIGQsIGxhbWJkYSkKICBzbW9vdGhsaXN0bm93dCA9IHNtb290aC5iYXNpcyhzZXEoMCwxLGxlbj01MSksICBjdXJ2ZSR5LCBmZFBhcm9iaikKICBhanVzdGUgPC0gc21vb3RobGlzdG5vd3QkZmQKICBkZiA8LSBzdXBwcmVzc1dhcm5pbmdzKGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSksIHkgPSBwcmVkaWN0KGFqdXN0ZSwgbmV3ZGF0YT1zZXEoMCwxLGxlbj01MSkpLGNhdD1wYXN0ZShhcy5jaGFyYWN0ZXIobmJhc2lzKSwiYmFzaWMga25vdHMiKSxnY3Y9c21vb3RobGlzdG5vd3QkZ2N2KSkKICByZXR1cm4oZGYpCn0KCmNyZWF0ZV9zbV9zcGxpbmVzX2ZvdXJpZXI8LWZ1bmN0aW9uKG5iYXNpcyxjdXJ2ZSxkPTIsbGFtYmRhPTEwXigtMikpewogIGJhc2lzb2JqID0gY3JlYXRlLmZvdXJpZXIuYmFzaXMoYygwLDEpLG5iYXNpcykKICBmZFBhcm9iaiA9IGZkUGFyKGJhc2lzb2JqLCBkLCBsYW1iZGEpCiAgc21vb3RobGlzdG5vd3QgPSBzbW9vdGguYmFzaXMoc2VxKDAsMSxsZW49NTEpLCAgY3VydmUkeSwgZmRQYXJvYmopCiAgYWp1c3RlIDwtIHNtb290aGxpc3Rub3d0JGZkCiAgZGYgPC0gc3VwcHJlc3NXYXJuaW5ncyhkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLCB5ID0gcHJlZGljdChhanVzdGUsIG5ld2RhdGE9c2VxKDAsMSxsZW49NTEpKSxjYXQ9cGFzdGUoYXMuY2hhcmFjdGVyKG5iYXNpcyksImJhc2ljIGtub3RzIiksZ2N2PXNtb290aGxpc3Rub3d0JGdjdikpCiAgcmV0dXJuKGRmKQp9CgoKYGBgCgoKYGBge3J9CiNDYWxjdWxhciBsYW1iZGEKY2FsY3VsYXJfbGFtYmRhPC1mdW5jdGlvbihpbmljaW8sZmluLHBhc28sbnVtX2Jhc2lzKXsKICBwcnVlYmFzPWxpc3QoKQogIGJhc2VfYXV4PWxpc3QoKQogIGZvcihpIGluIDE6MTAwKXsKICAgIFJfYXV4PC1ycmF5bGVpZ2goMSwgc2NhbGUgPSBzcXJ0KDAuMykpCiAgICB0aGV0YV9hdXg8LXJ1bmlmKDEsMCwyKnBpKQogICAgYmFzZV9hdXg9YXBwZW5kKGJhc2VfYXV4LHNpbXVsYXRlZF9mdW5jdGlvbnMoUl9pbiA9IFJfYXV4LHRoZXRhX2luID0gdGhldGFfYXV4KSkKICB9CiAgZm9yKGkgaW4gbnVtX2Jhc2lzKXsKICAgIGJhc2VfYnNwbGluZXM9Y3JlYXRlLmJzcGxpbmUuYmFzaXMoYygwLDEpLGkpCiAgICBiYXNlX2ZvdXJpZXI9Y3JlYXRlLmZvdXJpZXIuYmFzaXMoYygwLDEpLGkpCiAgICBmb3IoaiBpbiBzZXEoaW5pY2lvLGZpbixwYXNvKSl7CiAgICAgIGZkUGFyb2JqID0gZmRQYXIoYmFzZV9ic3BsaW5lcywgMiwgaikKICAgICAgZmRQYXJvYmpfZiA9IGZkUGFyKGJhc2VfYnNwbGluZXMsIDIsIGopCiAgICAgIHNtb290aGxpc3Rub3d0ID0gc21vb3RoLmJhc2lzKHNlcSgwLDEsbGVuPTUxKSwgIGN1cnZlJHksIGZkUGFyb2JqKQogICAgICBzbW9vdGhsaXN0bm93dF9mID0gc21vb3RoLmJhc2lzKHNlcSgwLDEsbGVuPTUxKSwgIGN1cnZlJHksIGZkUGFyb2JqKQogICAgICBwcnVlYmFzPWFwcGVuZChwcnVlYmFzLGxpc3QoYmFzZT0iYnNwbGluZSIsKSkKICAgICAgcHJ1ZWJhcz1hcHBlbmQocHJ1ZWJhcyxsaXN0KGJhc2U9ImZvdXJpZXIiLCkpCiAgICB9CiAgICAKICB9Cn0KYGBgCgoKCmBgYHtyfQpyZWdfNV9zbTwtY3JlYXRlX3NtX3NwbGluZXMoNSxzaW11bGF0ZWRfY3VydmUpCnJlZ18xNV9zbTwtY3JlYXRlX3NtX3NwbGluZXMoMTUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMjVfc208LWNyZWF0ZV9zbV9zcGxpbmVzKDI1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzVfc21fZjwtY3JlYXRlX3NtX3NwbGluZXNfZm91cmllcig1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzE1X3NtX2Y8LWNyZWF0ZV9zbV9zcGxpbmVzX2ZvdXJpZXIoMTUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMjVfc21fZjwtY3JlYXRlX3NtX3NwbGluZXNfZm91cmllcigyNSxzaW11bGF0ZWRfY3VydmUpCmBgYAoKCgoKCmBgYHtyfQpwX3NwbDwtZ2dwbG90KGRhdGEuZnJhbWUoeD1jKDAsMSksY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgsY29sb3VyPWNhdCkpICsgc3RhdF9mdW5jdGlvbihmdW49dHJ1ZV9mdW5jdGlvbnMpKyBnZW9tX2xpbmUoZGF0YSA9IHNpbXVsYXRlZF9jdXJ2ZSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfNV9zbSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMTVfc20sbGluZXR5cGUgPSAibG9uZ2Rhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMjVfc20sbGluZXR5cGUgPSAiZG90ZGFzaCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIjUgYmFzaWMga25vdHMiID0gImJsdWUiLCIxNSBiYXNpYyBrbm90cyI9InJlZCIsIjI1IGJhc2ljIGtub3RzIj0iZ3JlZW4iKSkrIHlsYWIoIiIpK3RoZW1lX2J3KCkreGxhYigiQmFzZSBCLVNwbGluZSIpCnBfc3BsX2Y8LWdncGxvdChkYXRhLmZyYW1lKHg9YygwLDEpLGNhdD0iVHJ1ZSBmdW5jdGlvbiIpLCBhZXMoeD14LGNvbG91cj1jYXQpKSArIHN0YXRfZnVuY3Rpb24oZnVuPXRydWVfZnVuY3Rpb25zKSsgZ2VvbV9saW5lKGRhdGEgPSBzaW11bGF0ZWRfY3VydmUsbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gcmVnXzVfc21fZixsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMTVfc21fZixsaW5ldHlwZSA9ICJsb25nZGFzaCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKyBnZW9tX2xpbmUoZGF0YSA9IHJlZ18yNV9zbV9mLGxpbmV0eXBlID0gImRvdGRhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJDdXJ2ZXMiLCB2YWx1ZXMgPSBjKCJUcnVlIGZ1bmN0aW9uIj0iYmxhY2siLCJTaW11bGF0ZWQgZnVuY3Rpb24iID0gIm9yYW5nZSIsICI1IGJhc2ljIGtub3RzIiA9ICJibHVlIiwiMTUgYmFzaWMga25vdHMiPSJyZWQiLCIyNSBiYXNpYyBrbm90cyI9ImdyZWVuIikpK3lsYWIoIiIpICt0aGVtZV9idygpK3hsYWIoIkJhc2UgRGUgRm91cmllciIpCnBfc3BsL3Bfc3BsX2YKCmBgYAoKCgpQYXJhIGxhcyBncsOhZmljYXMgcXVlIGdlbmVyYSBlbCBhdXRvciwgc2UgZ2VuZXJhbiBsYXMgMTAwIGN1cnZhcyBhIHBhcnRpciBkZSBsYSBzaW11bGFjacOzbiwgdGFsIGNvbW8gc2UgbWVuY2lvbmEgZW4gdW4gaW5pY2lvLCB5IHNlIGdyYWZpY2FuIGxhcyBmdW5jaW9uZXMKCgpgYGB7cn0KUjwtcnJheWxlaWdoKDEsIHNjYWxlID0gc3FydCgwLjMpKQp0aGV0YTwtcnVuaWYoMSwwLDIqcGkpCmBgYAoKCgpgYGB7cn0Kc2FtcGxlc19zbW9vdGhpbmc8LWZ1bmN0aW9uKG5iYXNpc19pbixjYWxjX3ZhcnM9RkFMU0UpewogaWYoY2FsY192YXJzIT1GQUxTRSl7CiBSX2F1eDwtcnJheWxlaWdoKDEsIHNjYWxlID0gc3FydCgwLjMpKQogdGhldGFfYXV4PC1ydW5pZigxLDAsMipwaSkKIH1lbHNlewogIFJfYXV4PVIKICB0aGV0YV9hdXg9dGhldGEKIH0KIHRydWVfZnVuY19hdXg9dHJ1ZV9mdW5jdGlvbnNfMihzZXEoMCwxLGxlbj01MSksUl9hdXgsdGhldGFfYXV4KQogc2ltdWxhdGVkX2N1cnZlX2F1eDwtc3VwcHJlc3NXYXJuaW5ncyhkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9c2ltdWxhdGVkX2Z1bmN0aW9ucyhSX2luPVJfYXV4LHRoZXRhX2luPXRoZXRhX2F1eCksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKSkKIHNtX2F1eD1zdXBwcmVzc1dhcm5pbmdzKCBjcmVhdGVfc21fc3BsaW5lcyhuYmFzaXNfaW4sc2ltdWxhdGVkX2N1cnZlX2F1eCkpCiBzbV9hdXhfZj1zdXBwcmVzc1dhcm5pbmdzKCBjcmVhdGVfc21fc3BsaW5lc19mb3VyaWVyKG5iYXNpc19pbixzaW11bGF0ZWRfY3VydmVfYXV4KSkKIHJlZ19hdXg9c3VwcHJlc3NXYXJuaW5ncyhjcmVhdGVfcmVncmVzc2lvbihuYmFzaXNfaW4sc2ltdWxhdGVkX2N1cnZlX2F1eCkpCiByZWdfYXV4X2Y9c3VwcHJlc3NXYXJuaW5ncyhjcmVhdGVfcmVncmVzc2lvbl9mb3VyaWVyKG5iYXNpc19pbixzaW11bGF0ZWRfY3VydmVfYXV4KSkKIE1TRV9yZWc9bWVhbigocmVnX2F1eCR5IC0gc2ltdWxhdGVkX2N1cnZlX2F1eCR5KV4yKQogTVNFX3JlZ19mPW1lYW4oKHJlZ19hdXhfZiR5IC0gc2ltdWxhdGVkX2N1cnZlX2F1eCR5KV4yKQogTVNFX3NtPW1lYW4oKHNtX2F1eCR5IC0gc2ltdWxhdGVkX2N1cnZlX2F1eCR5KV4yKQogTVNFX3NtX2Y9bWVhbigoc21fYXV4X2YkeSAtIHNpbXVsYXRlZF9jdXJ2ZV9hdXgkeSleMikKIHJldHVybihsaXN0KHRydWVfZj10cnVlX2Z1bmNfYXV4LHJlZ19zcGw9cmVnX2F1eCR5LHk9c2ltdWxhdGVkX2N1cnZlX2F1eCR5LHlfaGF0PXNtX2F1eCR5LGdjdl9yZWc9cmVnX2F1eCRnY3ZbMV0sZ2N2X3NtPXNtX2F1eCRnY3ZbMV0scmVnX3NwbF9mPXJlZ19hdXhfZiR5LHlfaGF0X2Y9c21fYXV4X2YkeSxnY3Zfc21fZj1zbV9hdXhfZiRnY3YsTVNFX3JlZz1NU0VfcmVnLE1TRV9yZWdfZj1NU0VfcmVnX2YsTVNFX3NtPU1TRV9zbSxNU0Vfc21fZj1NU0Vfc21fZikpCn0KYGBgCgpTZSBncmFmaWNhIGxhIGZ1bmNpw7NuIHJlbGEsIGxhIGZ1bmNpw7NuIHNpbXVsYWRhIGNvbiBlcnJvcmVzIG5vcm1hbGVzLCB5IGNvbiBsYXMgYmFzZXMgcXVlIGRlZmluaW1vcyBlbiBlbCBwbGFudGVhbWllbnRvIGRlIGxhIHNpbXVsYWNpw7NuICg1LCAxNSB5IDI1KS4gQWp1c3RhbmRvIHRhbWJpw6luIFJlZ3Jlc2nDs24gU3BsaW5lIHkgU21vb3RoaW5nIFNwbGluZSBjb24gdW4gJFxsYW1iZGE9MC4wMSQKYGBge3J9CmluZm9fYmFzaXM1XzE8LXNhbXBsZXNfc21vb3RoaW5nKDUpCmluZm9fYmFzaXMxNV8xPC1zYW1wbGVzX3Ntb290aGluZygxNSkKaW5mb19iYXNpczI1XzE8LXNhbXBsZXNfc21vb3RoaW5nKDI1KQpSPC1ycmF5bGVpZ2goMSwgc2NhbGUgPSBzcXJ0KDAuMykpCnRoZXRhPC1ydW5pZigxLDAsMipwaSkKaW5mb19iYXNpczVfMjwtc2FtcGxlc19zbW9vdGhpbmcoNSkKaW5mb19iYXNpczE1XzI8LXNhbXBsZXNfc21vb3RoaW5nKDE1KQppbmZvX2Jhc2lzMjVfMjwtc2FtcGxlc19zbW9vdGhpbmcoMjUpCgpgYGAKCgoKYGBge3J9CnA1XzE8LWdncGxvdChkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczVfMSR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzNV8xJHksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczVfMSRyZWdfc3BsLGNhdD0iUmVncmVzc2lvbiBTcGxpbmVzIiksbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXM1XzEkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCI1IEJhc2lzIGtub3RzIikreWxhYigiIikgK3RoZW1lX2J3KCkrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCnA1XzI8LWdncGxvdChkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczVfMiR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzNV8yJHksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczVfMiRyZWdfc3BsLGNhdD0iUmVncmVzc2lvbiBTcGxpbmVzIiksbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXM1XzIkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCI1IEJhc2lzIGtub3RzIikreWxhYigiIikgK3RoZW1lX2J3KCkKcDVfMStwNV8yK3Bsb3RfbGF5b3V0KG5jb2wgPSAyKQoKCmBgYAoKCmBgYHtyfQpwMTVfMTwtZ2dwbG90KGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMTVfMSR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMTVfMSR5LGNhdD0iU2ltdWxhdGVkIGZ1bmN0aW9uIiksbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMxNV8xJHJlZ19zcGwsY2F0PSJSZWdyZXNzaW9uIFNwbGluZXMiKSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczE1XzEkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCIxNSBCYXNpcyBrbm90cyIpK3lsYWIoIiIpICt0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMTVfMjwtZ2dwbG90KGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMTVfMiR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMTVfMiR5LGNhdD0iU2ltdWxhdGVkIGZ1bmN0aW9uIiksbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMxNV8yJHJlZ19zcGwsY2F0PSJSZWdyZXNzaW9uIFNwbGluZXMiKSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczE1XzIkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCIxNSBCYXNpcyBrbm90cyIpK3lsYWIoIiIpICt0aGVtZV9idygpCnAxNV8xK3AxNV8yCmBgYAoKCmBgYHtyfQpwMjVfMTwtZ2dwbG90KGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMjVfMSR0cnVlX2YsY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSArIGdlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMjVfMSR5LGNhdD0iU2ltdWxhdGVkIGZ1bmN0aW9uIiksbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMyNV8xJHJlZ19zcGwsY2F0PSJSZWdyZXNzaW9uIFNwbGluZXMiKSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczI1XzEkeV9oYXQsY2F0PSJTbW9vdGhpbmcgc3BsaW5lcywgTGFtYmRhPTAuMDEiKSxsaW5ldHlwZSA9ICJkb3RkYXNoIixhZXMoeD14LHk9eSxjb2xvdXI9Y2F0KSkrIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIlJlZ3Jlc3Npb24gU3BsaW5lcyIgPSAiYmx1ZSIsIlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSI9InJlZCIpKSt4bGFiKCIyNSBCYXNpcyBrbm90cyIpK3lsYWIoIiIpICt0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCnAyNV8yPC1nZ3Bsb3QoZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMyNV8yJHRydWVfZixjYXQ9IlRydWUgZnVuY3Rpb24iKSwgYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpICsgZ2VvbV9saW5lKCkrIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWluZm9fYmFzaXMyNV8yJHksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9aW5mb19iYXNpczI1XzIkcmVnX3NwbCxjYXQ9IlJlZ3Jlc3Npb24gU3BsaW5lcyIpLGxpbmV0eXBlID0gImRhc2hlZCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKyBnZW9tX2xpbmUoZGF0YSA9IGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1pbmZvX2Jhc2lzMjVfMiR5X2hhdCxjYXQ9IlNtb290aGluZyBzcGxpbmVzLCBMYW1iZGE9MC4wMSIpLGxpbmV0eXBlID0gImRvdGRhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQ3VydmVzIiwgdmFsdWVzID0gYygiVHJ1ZSBmdW5jdGlvbiI9ImJsYWNrIiwiU2ltdWxhdGVkIGZ1bmN0aW9uIiA9ICJvcmFuZ2UiLCAiUmVncmVzc2lvbiBTcGxpbmVzIiA9ICJibHVlIiwiU21vb3RoaW5nIHNwbGluZXMsIExhbWJkYT0wLjAxIj0icmVkIikpK3hsYWIoIjI1IEJhc2lzIGtub3RzIikreWxhYigiIikgK3RoZW1lX2J3KCkKcDI1XzErcDI1XzIKYGBgCgoKCgpgYGB7cn0KI2Fob3JhIHPDrSBsYXMgbXVlc3RyYXMKc2FtcGxlc19zbW9vdGhfNTwtbGlzdCgpCnNhbXBsZXNfc21vb3RoXzE1PC1saXN0KCkKc2FtcGxlc19zbW9vdGhfMjU8LWxpc3QoKQpmb3IoaSBpbiAxOjEwMCl7CiAgc2FtcGxlc19zbW9vdGhfNTwtYXBwZW5kKHNhbXBsZXNfc21vb3RoXzUsbGlzdChzYW1wbGVzX3Ntb290aGluZyg1LGNhbGNfdmFycyA9IFRSVUUpKSkKICBzYW1wbGVzX3Ntb290aF8xNTwtYXBwZW5kKHNhbXBsZXNfc21vb3RoXzE1LGxpc3Qoc2FtcGxlc19zbW9vdGhpbmcoMTUsY2FsY192YXJzID0gVFJVRSkpKQogIHNhbXBsZXNfc21vb3RoXzI1PC1hcHBlbmQoc2FtcGxlc19zbW9vdGhfMjUsbGlzdChzYW1wbGVzX3Ntb290aGluZygyNSxjYWxjX3ZhcnMgPSBUUlVFKSkpCn0KYGBgCgoKYGBge3J9CiNnZW5lcmFyIGdjdidzCmF1eF9iYXNpc181PC1jKCkKYXV4X2Jhc2lzXzE1PC1jKCkKYXV4X2Jhc2lzXzI1PC1jKCkKYXV4X2Jhc2lzXzVfZjwtYygpCmF1eF9iYXNpc18xNV9mPC1jKCkKYXV4X2Jhc2lzXzI1X2Y8LWMoKQptc2VfYmFzaXM1X3JlZzwtYygpCm1zZV9iYXNpczE1X3JlZzwtYygpCm1zZV9iYXNpczI1X3JlZzwtYygpCm1zZV9iYXNpczVfcmVnX2Y8LWMoKQptc2VfYmFzaXMxNV9yZWdfZjwtYygpCm1zZV9iYXNpczI1X3JlZ19mPC1jKCkKbXNlX2Jhc2lzNV9zbTwtYygpCm1zZV9iYXNpczE1X3NtPC1jKCkKbXNlX2Jhc2lzMjVfc208LWMoKQptc2VfYmFzaXM1X3NtX2Y8LWMoKQptc2VfYmFzaXMxNV9zbV9mPC1jKCkKbXNlX2Jhc2lzMjVfc21fZjwtYygpCmZvcihpIGluIDE6MTAwKXsKICBhdXhfYmFzaXNfNTwtYXBwZW5kKGF1eF9iYXNpc181LHNhbXBsZXNfc21vb3RoXzVbW2ldXSRnY3Zfc20pCiAgYXV4X2Jhc2lzXzE1PC1hcHBlbmQoYXV4X2Jhc2lzXzE1LHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kZ2N2X3NtKQogIGF1eF9iYXNpc18yNTwtYXBwZW5kKGF1eF9iYXNpc18yNSxzYW1wbGVzX3Ntb290aF8yNVtbaV1dJGdjdl9zbSkKICB1eF9iYXNpc181X2Y8LWFwcGVuZChhdXhfYmFzaXNfNV9mLHNhbXBsZXNfc21vb3RoXzVbW2ldXSRnY3Zfc21fZikKICBhdXhfYmFzaXNfMTVfZjwtYXBwZW5kKGF1eF9iYXNpc18xNV9mLHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kZ2N2X3NtX2YpCiAgYXV4X2Jhc2lzXzI1X2Y8LWFwcGVuZChhdXhfYmFzaXNfMjVfZixzYW1wbGVzX3Ntb290aF8yNVtbaV1dJGdjdl9zbV9mKQogIG1zZV9iYXNpczVfcmVnPC1hcHBlbmQobXNlX2Jhc2lzNV9yZWcsc2FtcGxlc19zbW9vdGhfNVtbaV1dJE1TRV9yZWcpCiAgbXNlX2Jhc2lzMTVfcmVnPC1hcHBlbmQobXNlX2Jhc2lzMTVfcmVnLHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kTVNFX3JlZykKICBtc2VfYmFzaXMyNV9yZWc8LWFwcGVuZChtc2VfYmFzaXMyNV9yZWcsc2FtcGxlc19zbW9vdGhfMjVbW2ldXSRNU0VfcmVnKQogIG1zZV9iYXNpczVfcmVnX2Y8LWFwcGVuZChtc2VfYmFzaXM1X3JlZ19mLHNhbXBsZXNfc21vb3RoXzVbW2ldXSRNU0VfcmVnX2YpCiAgbXNlX2Jhc2lzMTVfcmVnX2Y8LWFwcGVuZChtc2VfYmFzaXMxNV9yZWdfZixzYW1wbGVzX3Ntb290aF8xNVtbaV1dJE1TRV9yZWdfZikKICBtc2VfYmFzaXMyNV9yZWdfZjwtYXBwZW5kKG1zZV9iYXNpczI1X3JlZ19mLHNhbXBsZXNfc21vb3RoXzI1W1tpXV0kTVNFX3JlZ19mKQogIG1zZV9iYXNpczVfc208LWFwcGVuZChtc2VfYmFzaXM1X3NtLHNhbXBsZXNfc21vb3RoXzVbW2ldXSRNU0Vfc20pCiAgbXNlX2Jhc2lzMTVfc208LWFwcGVuZChtc2VfYmFzaXMxNV9zbSxzYW1wbGVzX3Ntb290aF8xNVtbaV1dJE1TRV9zbSkKICBtc2VfYmFzaXMyNV9zbTwtYXBwZW5kKG1zZV9iYXNpczI1X3NtLHNhbXBsZXNfc21vb3RoXzI1W1tpXV0kTVNFX3NtKQogIG1zZV9iYXNpczVfc21fZjwtYXBwZW5kKG1zZV9iYXNpczVfc21fZixzYW1wbGVzX3Ntb290aF81W1tpXV0kTVNFX3NtX2YpCiAgbXNlX2Jhc2lzMTVfc21fZjwtYXBwZW5kKG1zZV9iYXNpczE1X3NtX2Ysc2FtcGxlc19zbW9vdGhfMTVbW2ldXSRNU0Vfc21fZikKICBtc2VfYmFzaXMyNV9zbV9mPC1hcHBlbmQobXNlX2Jhc2lzMjVfc21fZixzYW1wbGVzX3Ntb290aF8yNVtbaV1dJE1TRV9zbV9mKQp9CgpkZl9nY3Y8LWFzLmRhdGEuZnJhbWUoYyhhdXhfYmFzaXNfNSxhdXhfYmFzaXNfMTUsYXV4X2Jhc2lzXzI1KSkKZGZfZ2N2X2Y8LWFzLmRhdGEuZnJhbWUoYyhhdXhfYmFzaXNfNV9mLGF1eF9iYXNpc18xNV9mLGF1eF9iYXNpc18yNV9mKSkKZGZfZ2N2JGJhc2lzPC1jKHJlcCgiNSBiYXNpYyBrbm90cyIsMTAwKSxyZXAoIjE1IGJhc2ljIGtub3RzIiwxMDApLHJlcCgiMjUgYmFzaWMga25vdHMiLDEwMCkpCmRmX2djdl9mJGJhc2lzPC1jKHJlcCgiNSBiYXNpYyBrbm90cyIsMTAwKSxyZXAoIjE1IGJhc2ljIGtub3RzIiwxMDApLHJlcCgiMjUgYmFzaWMga25vdHMiLDEwMCkpCmNvbG5hbWVzKGRmX2djdik8LWMoInZhbHVlIiwiYmFzaXMiKQpjb2xuYW1lcyhkZl9nY3ZfZik8LWMoInZhbHVlIiwiYmFzaXMiKQoKZGZfbXNlXzU8LWFzLmRhdGEuZnJhbWUoYyhtc2VfYmFzaXM1X3JlZyxtc2VfYmFzaXM1X3NtKSkKZGZfbXNlXzUkbWV0aG9kPC1jKHJlcCgiUmVnZ3Jlc2lvbiIsMTAwKSxyZXAoIlNtb290aGluZyIsMTAwKSkKY29sbmFtZXMoZGZfbXNlXzUpPC1jKCJ2YWx1ZSIsIm1ldGhvZCIpCmRmX21zZV8xNTwtYXMuZGF0YS5mcmFtZShjKG1zZV9iYXNpczE1X3JlZyxtc2VfYmFzaXMxNV9zbSkpCmRmX21zZV8xNSRtZXRob2Q8LWMocmVwKCJSZWdncmVzaW9uIiwxMDApLHJlcCgiU21vb3RoaW5nIiwxMDApKQpjb2xuYW1lcyhkZl9tc2VfMTUpPC1jKCJ2YWx1ZSIsIm1ldGhvZCIpCmRmX21zZV8yNTwtYXMuZGF0YS5mcmFtZShjKG1zZV9iYXNpczI1X3JlZyxtc2VfYmFzaXMyNV9zbSkpCmRmX21zZV8yNSRtZXRob2Q8LWMocmVwKCJSZWdncmVzaW9uIiwxMDApLHJlcCgiU21vb3RoaW5nIiwxMDApKQpjb2xuYW1lcyhkZl9tc2VfMjUpPC1jKCJ2YWx1ZSIsIm1ldGhvZCIpCmRmX21zZV81X2Y8LWFzLmRhdGEuZnJhbWUoYyhtc2VfYmFzaXM1X3JlZ19mLG1zZV9iYXNpczVfc21fZikpCmRmX21zZV81X2YkbWV0aG9kPC1jKHJlcCgiUmVnZ3Jlc2lvbiIsMTAwKSxyZXAoIlNtb290aGluZyIsMTAwKSkKY29sbmFtZXMoZGZfbXNlXzVfZik8LWMoInZhbHVlIiwibWV0aG9kIikKZGZfbXNlXzE1X2Y8LWFzLmRhdGEuZnJhbWUoYyhtc2VfYmFzaXMxNV9yZWdfZixtc2VfYmFzaXMxNV9zbV9mKSkKZGZfbXNlXzE1X2YkbWV0aG9kPC1jKHJlcCgiUmVnZ3Jlc2lvbiIsMTAwKSxyZXAoIlNtb290aGluZyIsMTAwKSkKY29sbmFtZXMoZGZfbXNlXzE1X2YpPC1jKCJ2YWx1ZSIsIm1ldGhvZCIpCmRmX21zZV8yNV9mPC1hcy5kYXRhLmZyYW1lKGMobXNlX2Jhc2lzMjVfcmVnX2YsbXNlX2Jhc2lzMjVfc21fZikpCmRmX21zZV8yNV9mJG1ldGhvZDwtYyhyZXAoIlJlZ2dyZXNpb24iLDEwMCkscmVwKCJTbW9vdGhpbmdzIiwxMDApKQpjb2xuYW1lcyhkZl9tc2VfMjVfZik8LWMoInZhbHVlIiwibWV0aG9kIikKCmBgYAoKCgpgYGB7cn0KI0dlbmVyYXIgbWF0cml6IHBhcmEgY2FkYSBiYXNlCm1hdF9iYXNpc181PC1jKCkKbWF0X2Jhc2lzXzE1PC1jKCkKbWF0X2Jhc2lzXzI1PC1jKCkKbWF0X2Jhc2lzX3JlZ181PC1jKCkKbWF0X2Jhc2lzX3JlZ18xNTwtYygpCm1hdF9iYXNpc19yZWdfMjU8LWMoKQptYXRfYmFzaXNfc21fNTwtYygpCm1hdF9iYXNpc19zbV8xNTwtYygpCm1hdF9iYXNpc19zbV8yNTwtYygpCmZvcihpIGluIDE6MTAwKXsKICBtYXRfYmFzaXNfNTwtcmJpbmQobWF0X2Jhc2lzXzUsc2FtcGxlc19zbW9vdGhfNVtbaV1dJHRydWVfZikKICBtYXRfYmFzaXNfMTU8LXJiaW5kKG1hdF9iYXNpc18xNSxzYW1wbGVzX3Ntb290aF8xNVtbaV1dJHRydWVfZikKICBtYXRfYmFzaXNfMjU8LXJiaW5kKG1hdF9iYXNpc18yNSxzYW1wbGVzX3Ntb290aF8yNVtbaV1dJHRydWVfZikKICBtYXRfYmFzaXNfcmVnXzU8LXJiaW5kKG1hdF9iYXNpc19yZWdfNSxzYW1wbGVzX3Ntb290aF81W1tpXV0kcmVnX3NwbCkKICBtYXRfYmFzaXNfcmVnXzE1PC1yYmluZChtYXRfYmFzaXNfcmVnXzE1LHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kcmVnX3NwbCkKICBtYXRfYmFzaXNfcmVnXzI1PC1yYmluZChtYXRfYmFzaXNfcmVnXzI1LHNhbXBsZXNfc21vb3RoXzI1W1tpXV0kcmVnX3NwbCkKICBtYXRfYmFzaXNfc21fNTwtcmJpbmQobWF0X2Jhc2lzX3NtXzUsc2FtcGxlc19zbW9vdGhfNVtbaV1dJHlfaGF0KQogIG1hdF9iYXNpc19zbV8xNTwtcmJpbmQobWF0X2Jhc2lzX3NtXzE1LHNhbXBsZXNfc21vb3RoXzE1W1tpXV0keV9oYXQpCiAgbWF0X2Jhc2lzX3NtXzI1PC1yYmluZChtYXRfYmFzaXNfc21fMjUsc2FtcGxlc19zbW9vdGhfMjVbW2ldXSR5X2hhdCkKfQoKYGBgCgoKYGBge3J9CiNvYnRlbmVyIGZ1bmNpb24gbWVkaWEKbWVhbl9iYXNpc181PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc181LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiB0cnVlIGZ1bmN0aW9uIikKbWVhbl9iYXNpc18xNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfMTUsIE1BUkdJTiA9IDIsIG1lYW4pLGN1cnZhPSJNZWFuIHRydWUgZnVuY3Rpb24iKQptZWFuX2Jhc2lzXzI1PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc18yNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gdHJ1ZSBmdW5jdGlvbiIpCm1lYW5fYmFzaXNfcmVnXzU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzX3JlZ181LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiKQptZWFuX2Jhc2lzX3JlZ18xNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfcmVnXzE1LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiKQptZWFuX2Jhc2lzX3JlZ18yNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfcmVnXzI1LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiKQptZWFuX2Jhc2lzX3NtXzU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzX3NtXzUsIE1BUkdJTiA9IDIsIG1lYW4pLGN1cnZhPSJNZWFuIFNtb290aGluZ3MgU3BsaW5lcyIpCm1lYW5fYmFzaXNfc21fMTU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzX3NtXzE1LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBTbW9vdGhpbmdzIFNwbGluZXMiKQptZWFuX2Jhc2lzX3NtXzI1PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc19zbV8yNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gU21vb3RoaW5ncyBTcGxpbmVzIikKCmBgYAoKClNlIGdyYWZpY2EgZWwgYm94cGxvdCBjb3JyZXNwb25kaWVudGUgYSBsb3MgdmFsb3JlcyBHQ1YgY29uIGNhZGEgdW5vIGRlIGxvcyB2YWxvcmVzIGRlIG7Dum1lcm8gZGUgYmFzZSAKCmBgYHtyfQpwX2JwPC1nZ3Bsb3QoZGZfZ2N2LCBhZXMoeD1iYXNpcywgeT12YWx1ZSwgZmlsbD1iYXNpcykpICsKICBnZW9tX2JveHBsb3QoKSt4bGFiKCJCLVNwbGluZSIpK3lsYWIoIiIpKyB0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCnBfYnBfZjwtZ2dwbG90KGRmX2djdl9mLCBhZXMoeD1iYXNpcywgeT12YWx1ZSwgZmlsbD1iYXNpcykpICsKICBnZW9tX2JveHBsb3QoKSt4bGFiKCJCYXNlcyBkZSBGb3VyaWVyIikreWxhYigiIikrIHRoZW1lX2J3KCkrdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKcF9icC9wX2JwX2YKYGBgCgpTZSBncmFmaWNhIGxhIGZ1bmNpw7NuIG1lZGlhIHBhcmEgbGFzIDEwMCBjcnV2YXMgZ2VuZXJhZGFzIHBhcmEgY2FkYSB1bmEgZGUgbGFzIGVsZWNjaW9uZXMgZGUgbsO6bWVybyBkZSBiYXNlcyAoNSwxNSB5IDI1KS4gVGFtYmnDqW4gc2UgcHJlc2VudGEgdW4gYm94cGxvdCBkZSBNU0UgcGFyYSBhbWJvcyBtw6l0b2RvcyBkZSBhanVzdGUgKFNtb290aGluZyBzcGxpbmVzIHkgUmVnZ3Jlc2lvbiBTcGxpbmVzKQoKIyMgZ3JhZmljYXIgY29uIDUgYmFzZXMKCmBgYHtyfQpwNTwtZ2dwbG90KG1lYW5fYmFzaXNfNSwgYWVzKHg9eCx5PXksY29sb3VyPWN1cnZhKSkgK2dlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfcmVnXzUsbGluZXR5cGUgPSAiZG90dGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSsgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX2Jhc2lzX3NtXzUsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJDdXJ2ZXMiLCB2YWx1ZXMgPSBjKCJNZWFuIHRydWUgZnVuY3Rpb24iPSJibGFjayIsIk1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIiA9ICJkYXJrZ3JlZW4iLCAiTWVhbiBTbW9vdGhpbmdzIFNwbGluZXMiID0gImJsdWUiKSkreWxhYigiIikrIHRoZW1lX2J3KCkKCmJwXzU8LWdncGxvdChkZl9tc2VfNSwgYWVzKHg9bWV0aG9kLCB5PXZhbHVlLCBmaWxsPW1ldGhvZCkpICsKICBnZW9tX2JveHBsb3QoKSt4bGFiKCJCLVNwbGluZSIpKyB5bGFiKCJNU0UiKSt0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmJwXzVfZjwtZ2dwbG90KGRmX21zZV81X2YsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQmFzZXMgZGUgRm91cmllciIpK3lsYWIoIiIpKyB0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwNQpicF81K2JwXzVfZgoKCmBgYAojIyBncmFmaWNhciBjb24gMTUgYmFzZXMKYGBge3J9CnAxNTwtZ2dwbG90KG1lYW5fYmFzaXNfMTUsIGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpICtnZW9tX2xpbmUoKSsgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX2Jhc2lzX3JlZ18xNSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfc21fMTUsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJDdXJ2ZXMiLCB2YWx1ZXMgPSBjKCJNZWFuIHRydWUgZnVuY3Rpb24iPSJibGFjayIsIk1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIiA9ICJkYXJrZ3JlZW4iLCAiTWVhbiBTbW9vdGhpbmdzIFNwbGluZXMiID0gImJsdWUiKSkreWxhYigiIikrIHRoZW1lX2J3KCkKYnBfMTU8LWdncGxvdChkZl9tc2VfMTUsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQi1TcGxpbmUiKSt5bGFiKCJNU0UiKSsgdGhlbWVfYncoKSt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpicF8xNV9mPC1nZ3Bsb3QoZGZfbXNlXzE1X2YsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQmFzZXMgZGUgRm91cmllciIpK3lsYWIoIiIpKyB0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMTUKYnBfMTUrYnBfMTVfZgoKCmBgYAoKIyMgR3JhZmljYXIgY29uIDI1IGJhc2VzCgpgYGB7cn0KcDI1PC1nZ3Bsb3QobWVhbl9iYXNpc18yNSwgYWVzKHg9eCx5PXksY29sb3VyPWN1cnZhKSkgK2dlb21fbGluZSgpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfcmVnXzI1LGxpbmV0eXBlID0gImRvdHRlZCIsYWVzKHg9eCx5PXksY29sb3VyPWN1cnZhKSkrIGdlb21fbGluZShkYXRhID0gbWVhbl9iYXNpc19zbV8yNSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkN1cnZlcyIsIHZhbHVlcyA9IGMoIk1lYW4gdHJ1ZSBmdW5jdGlvbiI9ImJsYWNrIiwiTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiID0gImRhcmtncmVlbiIsICJNZWFuIFNtb290aGluZ3MgU3BsaW5lcyIgPSAiYmx1ZSIpKSt5bGFiKCIiKSt0aGVtZV9idygpCgoKYnBfMjU8LWdncGxvdChkZl9tc2VfMjUsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQi1TcGxpbmUiKSt5bGFiKCJNU0UiKSsgdGhlbWVfYncoKSt0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpicF8yNV9mPC1nZ3Bsb3QoZGZfbXNlXzI1X2YsIGFlcyh4PW1ldGhvZCwgeT12YWx1ZSwgZmlsbD1tZXRob2QpKSArCiAgZ2VvbV9ib3hwbG90KCkreGxhYigiQmFzZXMgZGUgRm91cmllciIpK3lsYWIoIiIpKyB0aGVtZV9idygpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMjUKYnBfMjUrYnBfMjVfZgoKYGBgCgoKCgoK